Java 如何提取Y、Cb和Cr颜色成分?

Java 如何提取Y、Cb和Cr颜色成分?,java,colors,rgb,format-conversion,Java,Colors,Rgb,Format Conversion,我需要将给定的彩色图片分解为三个单独的图片,这样每个颜色分量(Y、Cb、Cr)都存储在一个类似的图片中。 也许我有办法用 分别是Y、Cb或Cr颜色分量?有了下面的代码,我就可以读出文件并将颜色模型从RGB转换为YCbCr import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class SpaceConv

我需要将给定的彩色图片分解为三个单独的图片,这样每个颜色分量(Y、Cb、Cr)都存储在一个类似的图片中。 也许我有办法用
分别是Y、Cb或Cr颜色分量?有了下面的代码,我就可以读出文件并将颜色模型从RGB转换为YCbCr

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class SpaceConverter {

    static int [] colorComponentsYCbCr = new int[3];
    static int [] colorComponentsRGB = new int[3];


    public static void getRGBComponents (int color)
    {
        colorComponentsRGB [0] = (color & 0xff);
        colorComponentsRGB [1] = (color & 0x00ff) >> 8;
        colorComponentsRGB [2] = (color & 0x0000ff) >> 16;
    }

    public static void convertYCbCr2RGB(int [] componentsYCbCrToConvert)
    {
        int Y = componentsYCbCrToConvert [0];
        int Cb = componentsYCbCrToConvert [1];
        int Cr = componentsYCbCrToConvert [2];

        colorComponentsRGB = new int [3];
        colorComponentsRGB [0] = (int) (Y                        +   1.402 * (Cr - 128));
        colorComponentsRGB [1] = (int) (Y - 0.34414 * (Cb - 128) - 0.71414 * (Cr - 128));
        colorComponentsRGB [2] = (int) (Y + 1.772   * (Cb - 128));
    }

    public static void convertRGB2YCbCr(int [] componentsRGB)
    {
        int blue = componentsRGB [0];
        int green = componentsRGB [1];
        int red = componentsRGB [2];

        colorComponentsYCbCr [0] = (int) (0.299     *   red + 0.587 * green + 0.114 * blue);
        colorComponentsYCbCr [1] = (int) (128-0.169 *   red-0.331   * green + 0.500 * blue);
        colorComponentsYCbCr [2] = (int) (128+0.500 *   red - 0.419 * green - 0.081 * blue);
    }

    public static void getColoredCrPicture(BufferedImage image)
    {
        File f = null;
        // get width and height
        int width = image.getWidth();
        int height = image.getHeight();     

        for (int y = 0; y<height; y++)
        {
            for (int x = 0; x<width; x++)
            {
                int color = image.getRGB(x, y);
                getRGBComponents(color);
                convertRGB2YCbCr(colorComponentsRGB);

                int Y = colorComponentsYCbCr[0];
                int Cb = colorComponentsYCbCr[1];
                int Cr = colorComponentsYCbCr[2];   
                Y = 0;
                Cb = 0;

                int p = (Y << 24) | (Cb << 16) | (Cr<<8);           
                image.setRGB(x, y, p);
            }
        }
        try
        {
            f = new File("/Users/MAC/Documents/workspace/ColorConverter/src/outputX.jpg");
            ImageIO.write(image, "jpg", f);
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
    }

    public static void getColoredCbPicture(BufferedImage image)
    {
       File f = null;
       // get width and height
       int width = image.getWidth();
       int height = image.getHeight();

       for (int y = 0; y<height; y++)
       {
           for (int x = 0; x<width; x++)
           {
                int color = image.getRGB(x, y);
                getRGBComponents(color);
                convertRGB2YCbCr(colorComponentsRGB);

                int Y = colorComponentsYCbCr[0];
                int Cb = colorComponentsYCbCr[1];
                int Cr = colorComponentsYCbCr[2];   

                Y = 0;
                Cr = 0;
                int p = (Y << 24) | (Cb<< 16) | (Cr <<8);
                image.setRGB(x, y, p);
           }
        }
        try
        {
           f = new File("/Users/MAC/Documents/workspace/ColorConverter/src/outputCb.jpg");
           ImageIO.write(image, "jpg", f);
           System.out.println("WRITE Status: OK");
        }
        catch(IOException e)
        {
           System.out.println(e);
        }

    }

    public static BufferedImage loadPicture()
    {
        File f = null;
        BufferedImage img = null;

        // read Image
        try
        {
            f = new File("/Users/MAC/Documents/workspace/ColorConverter/src/VILLA.JPG");
            img = ImageIO.read(f);
            System.out.println("READ Status: OK");
            getColoredCbPicture(img);
        }   
        catch(IOException e)
        {
            System.out.println(e);
        }
        return img;
    }

    public static void main(String[] args)
    {
        BufferedImage image = null;
        loadPicture();
        getColoredCbPicture(image);
    }
}
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
公共类空间转换器{
静态int[]colorComponentsYCbCr=新int[3];
静态int[]colorComponentsRGB=新int[3];
公共静态void getRGBComponents(int颜色)
{
ColorComponentRGB[0]=(颜色和0xff);
ColorComponentRGB[1]=(颜色&0x00ff)>>8;
ColorComponentRGB[2]=(颜色&0x0000ff)>>16;
}
公共静态void convertYCbCr2RGB(int[]组件sycbcrtoconvert)
{
int Y=组件sycbcrotconvert[0];
int Cb=组件sycbcrotconvert[1];
int Cr=组件sycbcrotconvert[2];
ColorComponentRGB=新整数[3];
颜色分量RGB[0]=(int)(Y+1.402*(Cr-128));
颜色分量RGB[1]=(int)(Y-0.34414*(Cb-128)-0.71414*(Cr-128));
颜色分量RGB[2]=(int)(Y+1.772*(Cb-128));
}
公共静态void convertRGB2YCbCr(int[]componentsRGB)
{
int蓝色=组件GB[0];
int绿色=组件GB[1];
int red=组件GB[2];
颜色分量SYCBCR[0]=(整数)(0.299*红色+0.587*绿色+0.114*蓝色);
颜色成分SYCBCR[1]=(int)(128-0.169*红色-0.331*绿色+0.500*蓝色);
颜色成分SYCBCR[2]=(int)(128+0.500*红色-0.419*绿色-0.081*蓝色);
}
公共静态无效getColoredCrPicture(BuffereImage图像)
{
文件f=null;
//获取宽度和高度
int width=image.getWidth();
int height=image.getHeight();

对于(int y=0;y来说,听起来您希望做的是拍摄RGB图像,将其转换为YCbCr,并将YCbCr中的三个通道中的每一个显示为单独的RGB图像

您已经有了从RGB转换到YCbCr的代码。您还需要进行反向转换的代码,以便可以从YCbCr转换到RGB


您可能希望使用相同的逻辑,但实际上创建了三个Y'CrCb图像:(Y,0,0),(0,Cb,0)和(0,0,Cr)。然后将这三个图像转换为RGB。这三个图像将是三个YCbCr通道中每个通道的RGB表示。

你的问题并不完全清楚。如果我理解正确,在计算每个像素的Y、Cb和Cr数后,你必须找出如何将每个通道转换回RGB表示你可以写成JPEG格式的缩进。我已经编辑了我的代码,所以现在它还可以选择将YCbCr转换为RGB。当我启动程序时,它会为“Cb图片”创建一个红色图片。我想这是因为
int p=(Y请帮助!该程序对我来说并不重要。我只需要这三张图片,用于我的图片的Y、Cb和Cr,以便在我的PowerPoint演示文稿中讨论JPEG标准,直到今天晚上:(