2

特定の画像処理コードに opencv を使用しています。特定の画像からカラー レイヤーを抽出する必要があります。したがって、ピクセルを特定の値に保ち、残りのピクセルを背景色 (この場合は白) に設定します。特定の問題では、この操作全体を CIE-L*a*b* 色空間で実行する必要があります。上記の画像を RGB に変換すると問題が発生しcvCvtColor()、背景が白のままではなくなります。さまざまな順列と値の組み合わせを試してみましたが、赤か青か、真っ白ではありません。

絵の具 (白のみ) で画像を作成し、それを L*a*b* 空間に変換して、値をテキスト ファイルに出力しました。ここにコードがあります

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]);

3 つの値すべてが 255 であることを示しています。しかし、必要なプログラムでピクセル値を設定すると、赤みがかってしまいます。

ピクセル値を設定するコード スニペットを次に示します。

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);

どんな助けでも大歓迎です。前もって感謝します !

4

1 に答える 1

2

コメントを大まかに要約するには:

In L*a*b* 値は通常 [0,100] であり、"a および "b" は署名されており、明確な境界はありません。8 ビット イメージの opencv では、値は次のように変換されます。

  • L <- L * 255/100
  • a <- a+128
  • b <- b+128

CIELab では、「白」は大まかに (100,0,0) として表され、その変換によって (255,128,128) になります。32 ビットの浮動小数点画像を使用する場合、この最後の変換は必要なく、(100.0,0.0,0.0) を白として使用できます。

于 2012-08-02T22:05:30.877 に答える