2016-08-10 7 views
0

각 색상 구성 요소 (Y, Cb, Cr)가 here과 같은 하나의 그림에 저장되도록 3 개의 개별 그림으로 주어진 색상의 그림을 분해해야합니다.
으로 Y, Cb 또는 Cr 색상 구성 요소를 사용하여이 세 가지 그림을 어떻게 얻을 수 있을지 궁금한가요? 다음 코드로 파일을 읽고 색상 모델을 RGB에서 YCbCr로 변환 할 수 있습니다.Y, Cb 및 Cr 색상 요소를 추출하는 방법은 무엇입니까?

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); 
    } 
} 
+0

질문이 명확하지 않습니다. 내가 올바르게 이해한다면 각 픽셀의 Y, Cb 및 Cr 수를 계산 한 후에 각 채널을 다시 JPEG로 작성할 수있는 RGB 표현으로 변환하는 방법을 알아야합니다. –

답변

1

그것은 당신이 찾고있는 것을 같은 소리하는 것은, RGB 이미지를 취할 된 YCbCr로 변환하고 별도의 RGB 이미지로의 YCbCr에있는 3 개 개의 각 채널을 표시합니다.

이미 RGB에서 YCbCr로 변환하는 코드가 있습니다. YCbCr에서 RGB로 변환 할 수 있도록 역 변환을 수행하는 코드가 필요합니다.

이 논리를 사용하려고하지만 실제로는 (Y, 0, 0), (0, Cb, 0) 및 (0, 0, Cr)의 세 Y'CrCb 이미지를 만듭니다. 그런 다음이 세 가지 이미지 각각을 RGB로 변환하십시오. 이 세 개의 이미지는 세 개의 YCbCr 채널 각각의 RGB 표현입니다.

+0

코드를 편집 했으므로 YCbCr을 RGB로 변환 할 수있는 옵션도 있습니다. 프로그램을 시작하면 "Cb- 그림"의 붉은 색 그림이 만들어집니다. 나는 그것이'int p = (Y << 24) | (Cb << 16) | (Cr << 8); image.setRGB (x, y, p);' 'YCbCr'구성 요소와 작동하는 방법이 있습니까? 예. RGB2YCbCr 대화 이후에'Y = 0; Cb = 0; Cr = 123; p = (Y << 24) | (Cb << 16) | (Cr << 8); image.setRGB (x, y, p);'그것이 R = 0으로 설정한다는 의미는 아닙니다. G = 0; 블루 컴포넌트를 123으로 변경 하시겠습니까? – Samashki95

+0

도와주세요! 이 프로그램은 저에게 중요하지 않습니다. 오늘 저녁까지 PowerPoint 프레젠테이션에서 JPEG 표준에 대해 이야기하기 위해 Y, Cb 및 Cr에 대한 사진 3 장이 필요합니다. ( – Samashki95