0

如何检测 RGB 颜色中的白色?

我的意思是如何更改代码中的颜色或者我应该在代码中更改什么?

此代码检测红色:

#include"math.h"
#include"conio.h"
#include"cv.h"
#include"highgui.h"
#include"stdio.h"
int main() {
    int i,j,k;
    int height,width,step,channels;
    int stepr, channelsr;
    int temp=0;
    uchar *data,*datar;
    i=j=k=0;
    IplImage *frame=cvLoadImage("red.jpg",1);
    IplImage *result=cvCreateImage( cvGetSize(frame), 8, 1 );
    if(frame==NULL ) {
        puts("unable to load the frame");exit(0);
    }
    printf("frame loaded");
    cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Result",CV_WINDOW_AUTOSIZE);
    height = frame->height;
    width = frame->width;
    step =frame->widthStep;
    channels = frame->nChannels;
    data = (uchar *)frame->imageData;
    stepr=result->widthStep;
    channelsr=result->nChannels;
    datar = (uchar *)result->imageData;
    for(i=0;i < (height);i++) for(j=0;j <(width);j++)
    if(((data[i*step+j*channels+2]) > (29+data[i*step+j*channels])) && 
            ((data[i*step+j*channels+2]) > (29+data[i*step+j*channels+1])))
        datar[i*stepr+j*channelsr]=255;
    else
        datar[i*stepr+j*channelsr]=0;
    cvShowImage("original",frame);
    cvShowImage("Result",result);
    cvSaveImage("result.jpg",result);
    cvWaitKey(0);
    cvDestroyWindow("original");
    cvDestroyWindow("Result");
    return 0;
}
4

1 回答 1

0

如果您检测到 3 个 rgb 通道几乎相等,这将检测从黑色到灰色到白色的颜色。为了检查白色,您可能会检查每个像素

1) 明亮

r > 250 , g > 250, b > 250

2) 颜色几乎相等 abs(r - b) < 2, abs(g - b) < 2, abs(r - g) < 2 *

值 250 和 2 只是一个示例,您应该尝试直到获得满意的结果。

您应该使用与上述等效的代码更改条件

if(((data[i*step+j*channels+2]) > (29+data[i*step+j*channels])) && 
        ((data[i*step+j*channels+2]) > (29+data[i*step+j*channels+1])))
    datar[i*stepr+j*channelsr]=255;
else
    datar[i*stepr+j*channelsr]=0;

*笔记; 如果值 r,g,b 是无符号的(在这种情况下它们是),您应该将数字转换为有符号的

绝对((int)r - g)< 2

于 2012-08-29T08:23:57.743 回答