如何使用 Color.RGBtoHSB 显示从 RGB 转换的 HSB 图像?

How do I display an HSB image I converted from RGB using Color.RGBtoHSB?

提问人:Michael243 提问时间:11/16/2023 最后编辑:Michael243 更新时间:11/16/2023 访问量:27

问:

我有一张 RGB 色彩空间的 450x390 图像。使用 Color.RGBtoHSB() 我提取了每个像素的 HSB(色相、饱和度和亮度)值。如何显示此 HSB 图像?

-我尝试将值存储到 (3x450x390) 的 3d 数组中。我不知道如何将其转换为可显示的图像。

-我还尝试使用 (int)(hsbVals[i]*255) 转换 HSB 值,然后使用 img.setRGB 将原始像素替换为新的 HSB 像素,然后显示它。该图像带有浓重的蓝色调,而不是人们通常期望的灰度图像。

-我希望使用光栅来完成像 raster.setsamples() 这样的工作。但是由于我对 java 栅格的不熟悉以及缺乏在线文档,我遇到了麻烦。


import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;

import javax.swing.JLabel;
public class example {  
    public static BufferedImage readImage(String url) {
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File(url));
        } catch (IOException e) {
        }
       return img;
    }
    public static void showImage(Image img, String label) throws IOException {
        ImageIcon icon=new ImageIcon(img);
        JFrame frame=new JFrame(label);
        frame.setLayout(new FlowLayout());
        int width = img.getWidth(null); 
        int height = img.getHeight(null);
        frame.setSize(width,height);
        JLabel lbl=new JLabel();
        lbl.setIcon(icon);
        frame.add(lbl);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) throws IOException {

        BufferedImage img = readImage("src/test_001.jpg");
        showImage(img, "RGB image");
        for(int i=0;i<450;i++) {
            for(int j=0;j<390;j++) {
                Color rgbColor = new Color(img.getRGB(i, j));
                int r = rgbColor.getRed();
                int g = rgbColor.getGreen();
                int b = rgbColor.getBlue();
                float [] hsbVals = new float[3];
                Color.RGBtoHSB(r, g, b, hsbVals);
            }
        }
        showImage(img, "HSB image");        
    }
}

Java 图像处理 栅格 bufferedimage

评论

1赞 Harald K 11/16/2023
HSB 和 RGB 不就是表示相同视觉颜色的不同方式吗?因此,如果您希望 HSB 图像是灰度的,我相信这是因为您只单独显示 H、S 或 B 通道之一(我希望 B 最有意义)?将 HSB 值放回 RGB 可能是一种有趣的视觉效果,但没有多大意义。

答: 暂无答案