现在的位置: 首页 > 综合 > 正文

对图像中的三个通道求和,并且在值为100处对结果图像进行截断(针对一些图像不能正常显示,提出个人见解)

2017年11月09日 ⁄ 综合 ⁄ 共 1534字 ⁄ 字号 评论关闭

#include "highgui.h"
#include  "cv.h"
using namespace cv;
 

void sum_rgb(IplImage* src, IplImage* dst)
{

IplImage* r=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U ,1);

IplImage* g=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U ,1);

IplImage* b=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U ,1);

   IplImage* s=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F ,1);

    cvSplit(src,r,g,b,NULL);

cvZero(s);
cvAcc(b,s);
cvAcc(r,s);
cvAcc(g,s);

cvThreshold(s,s,100,100,CV_THRESH_TRUNC);
cvConvertScale(s,dst,1,0);

cvReleaseImage(&r);
cvReleaseImage(&g);
cvReleaseImage(&b);

}

int main(int argc,char** argv)
{

IplImage* src=cvLoadImage("f:\\lena.jpg");

IplImage* dst=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);

sum_rgb(src,dst);

cvNamedWindow("源图像",1);
cvShowImage("源图像",src);
cvNamedWindow("目标图像",1);
cvShowImage("目标图像",dst);
cvWaitKey(0);
cvReleaseImage(& dst);
cvReleaseImage(& src);
cvDestroyWindow("源图像");
cvDestroyWindow("目标图像");

}

图像显示如下

此时发现目标图像不能正常显示出来,后面我换了一张图片“cat.jpg”重新编译后的结果如下:

这时我们可以发现程序本身是没问题的,第二张图片的效果虽然不是很明显,但基本还是能看到一些,对于第一张图片没能正常显示出来的原因在于(我个人的见解而已,我是一个初学图像者,这样的见解或许也不一定对,仅供参考):

PS:

threshold_type为阈值类型,其中包括如下类型:
CV_THRESH_BINARY            (X>T)?M:0
CV_THRESH_INV               (X>T)?0:M
CV_THRESH_TRUNC             (X>T)?M:X
CV_THRESH_TOZERO_INV        (X>T)?0:X
CV_THRESH_TOZERO            (X>T)?X:0

在我的程序中我选择的是第三个阈值类型,第一张图片不能正常显示是因为当三个通道的像素值加起来时每个位置的像素值都超过我设置的分割阈值(T=100),根据第三个阈值类型可知,整张图片的像素值都被设置为M(我设置的M=100)了,导致图片的所有边缘轮廓都没办法看到了,图像不能正常的显示而变成了一张灰色图像。刚好第二张图片的某些位置的像素值相加后没有远远的超过阈值T,所以最终可以显示出来。有两个办法可以让第一张图片显示出来:第一种方法,修改T、M的值,下面我采用T=200,M=200时图片的效果如下所示:

第二种方法:修改阈值类型,我采用的是第五个类型,此时T=100,M=100,图片效果如下所示:

这个小小的总结就到此了~~~~

抱歉!评论已关闭.