2012-07-02 2 views
2

특정 이미지 처리 코드에 opencv를 사용하고 있습니다. 특정 그림에서 색 레이어를 추출해야합니다. 그래서 내가하는 일은 픽셀을 일정한 값으로 유지하고 나머지 픽셀을 배경색 (이 경우 흰색)으로 설정하는 것입니다. 특정 문제에 대해서는 CIE-L * a * b * 색상 공간에서이 전체 작업을 수행해야합니다. 위의 이미지를 RGB로 변환 할 때 cvCvtColor() 배경을 더 이상 흰색으로 사용하지 않으면 문제가 발생합니다. 다른 순열과 값 조합을 시도했지만 빨강 또는 파랑 또는 순수한 흰색이 아닌 다른 값이됩니다.CIE L * a * b *에서 흰색을 표현할 때 opencv를 사용하는 RGB 변환

페인트 (그냥 흰색)로 그림을 만들고 L * a * b * 공간으로 변환하여 텍스트 파일에 값을 인쇄했습니다. 다음은이 모든 세 개의 값이 255로 보여줍니다 코드

IplImage *image, *lab; 
uchar *data; 
FILE *fp; 
int i, j; 
image = cvLoadImage("white.png", CV_LOAD_IMAGE_UNCHANGED); 
lab = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 3); 
cvCvtColor(image, lab, CV_BGR2Lab); 
data = (uchar*)lab->imageData; 
fp= fopen("white.txt", "w"); 
for(i=0; i<lab->height; i++) 
     for(j=0; j<lab->width; j++) 
        fprintf(fp, "L = %d, a = %d, b = %d\n", data[i*lab->widthStep + j*lab->nChannels +0], data[i*lab->widthStep + j*lab->nChannels +0], data[i*lab->widthStep + j*lab->nChannels +0]); 

하지만 난 그것에 내 필요한 프로그램의 픽셀 값을 설정하면, 그것은 붉은 색이된다. 여기

는 픽셀 값

image = cvLoadImage("pic11.png", CV_LOAD_IMAGE_UNCHANGED); 
cvCvtColor(image, lab, CV_BGR2Lab); 

copy = cvCreateImage(cvSize(lab->width,lab->height), IPL_DEPTH_8U, 3); 
cvCopy(lab, copy, NULL); 
data2 = (uchar*)copy->imageData;  

copied = cvCreateImage(cvSize(copy->width,copy->height), IPL_DEPTH_8U, 3); 
data = (uchar*)copied->imageData; 

for(i=x; i<copy->height; i++) 
      for(j=y; j<copy->width; j++) 
      {   
        if(data2[i*copy->widthStep + j*copy->nChannels + 0] == r && 
         data2[i*copy->widthStep + j*copy->nChannels + 1] == g && 
         data2[i*copy->widthStep + j*copy->nChannels + 2] == b) 
        { 
          data[i*copy->widthStep + j*copy->nChannels + 0] = r; 
          data[i*copy->widthStep + j*copy->nChannels + 1] = g; 
          data[i*copy->widthStep + j*copy->nChannels + 2] = b; 
        } 
        else 
        { 
         data[i*copy->widthStep + j*copy->nChannels + 0] = 255; 
         data[i*copy->widthStep + j*copy->nChannels + 1] = 255; 
         data[i*copy->widthStep + j*copy->nChannels + 2] = 255; 
        } 
      } 

copy_im = cvCreateImage(cvSize(copied->width,copied->height), IPL_DEPTH_8U, 3); 
cvCvtColor(copied, copy_im, CV_Lab2BGR); 
cvSaveImage("copy.jpg", copy_im); 

어떤 도움은 매우 극명하게 될 것이다을 설정하는 코드입니다. 미리 감사드립니다!

+0

적어도 L * a * b *의 숫자가 일반적으로 사용되므로 255라는 세 값은 모두 의미가 없습니다. L은 일반적으로 0에서 100까지만 사용됩니다. 적어도 메모리가 작동하면 100, 0, 0은 순수한 흰색을 주어야합니다. 편집 : 빠른 테스트는 Photoshop (하나는 동의 함)이 동의하는 것으로 보입니다. L, a 및 b 값에 ​​대해 100, 0, 0을 입력하면 RGB 255, 255, 255가됩니다. –

+0

CIELab white는 (100,0, 0). 너 (255,255,255) 가고 있니? 이것은 매우 잘못되었습니다. –

+0

내가 255 255 255 얻을 이유는 변환 할 수있는 색 함수가 L, a, b 값을 0-255 범위로 매핑하는 것 때문입니다. 일반적으로 나는 값이 '0≤L≤100, -127≤a≤127, -127≤b≤127'인 것을 안다. 그러나 변환 색상 함수는 'L Koustav

답변

2

대략 주석을 요약하면 : L에서

* A * B를 * 값이 보통은 [0,100]과 "a 및"b "를 전혀 잘 정의 된 경계를 가진 서명 OpenCV의 8 비트에. 다음 이미지 값이 변환된다

  • < L - L *의 100분의 255
  • < - A + 128
  • < B - B + 128
  • 0,123,516

CIELab에서 "흰색"은 그 변환에 따라 (255,128,128)가되는 (100,0,0)과 같이 대략 표현됩니다. 32 비트 부동 소수점 이미지를 사용하는 경우이 마지막 변환은 필요하지 않으므로 (100.0,0.0,0.0)을 흰색으로 사용할 수 있습니다.