《学习OpenCV》第三章课后题7

题目说明:
使用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;
}
发布了19 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/windxf/article/details/46559503