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

#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,图片效果如下所示:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值