题目说明:
使用cvCmp()创建一个掩码。加载一个真实的图像。使用cvSplit()将图像分割成红,绿,蓝三个单通道图像。
a.找到并显示绿图。
b.克隆这个绿图两次(分别命名为clone1和clone2)。
c.求出这个绿色平面的最大值和最小值。
d.将clone1所有元素赋值为thresh=(unsigned char)((最大值-最小值)/2.0)。
e.将clone2所有元素赋值为0,然后调用函数cvCmp(green_image,clone1,clone2,CV_CMP_GE)。现在clone2将是一个标识绿图中值超过thresh的掩码图像。
f.最后,使用cvSubS(green_image,thresh/2,green_image,clone2)函数并显示结果。
#include <highgui.h>
#include <cv.h>
#include <stdio.h>
int main()
{
// 读入图像
IplImage* shark = cvLoadImage("G:/数据/OpenCV数据/shark.jpg", 1);
// 将图像三个不同的通道分配空间
CvSize size = cvSize(shark->width,shark->height);
IplImage* shark_b = cvCreateImage(size,shark->depth,1);
IplImage* shark_g = cvCreateImage(size,shark->depth,1);
IplImage* shark_r = cvCreateImage(size,shark->depth,1);
// 将图像分为三个不同的通道
cvSplit(shark,shark_b,shark_g,shark_r,NULL);
// 显示绿色通道
cvNamedWindow("shark_g",1);
cvShowImage("shark_g", shark_g);
//克隆绿图两次
IplImage* clone1 = cvCloneImage(shark_g);
IplImage* clone2 = cvCloneImage(shark_g);
//求出这个绿色平面的最大最小值
double min,max;
cvMinMaxLoc(shark_g,&min,&max,NULL,NULL,NULL);
//将clone1的所有元素赋值为thresh=(unsigned char)((最大值-最小值)/2.0)
unsigned char thresh = (unsigned char)(max-min)/2.0;
//其实以下可以直接用这句完成cvSet(image, cvScalarAll(thresh));
char *p = shark_g->imageData;
for(int i = 0;i<shark_g->width;i++)
{
for(int j = 0;j<shark_g->height;j++)
{
*p++ = thresh;
}
}
//将clone2所有元素赋值为0
cvZero(clone2);
//调用函数cvCmp使clone2为一个标识绿图中值超过thresh的掩码图像
cvCmp(shark_g,clone1,clone2,CV_CMP_GE);
//调用函数cvSubS
CvScalar value = cvScalarAll(thresh/2);
cvSubS(shark_g,value,shark_g,clone2);
//显示结果图像
cvNamedWindow("shark_g_out",1);
cvShowImage("shark_g_out", shark_g);
//释放资源
cvWaitKey(0);
cvReleaseImage(&shark);
cvDestroyAllWindows();
return 0;
}