对图像中的三个通道求和,并且在值为100处对结果图像进行截断(针对一些图像不能正常显示,提出个人见解)
2014-05-26 10:56
309 查看
#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("目标图像");
}
图像显示如下
![](http://img.blog.csdn.net/20140526100044078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh5MTk4OTMz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
此时发现目标图像不能正常显示出来,后面我换了一张图片“cat.jpg”重新编译后的结果如下:
![](http://img.blog.csdn.net/20140526101136437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh5MTk4OTMz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这时我们可以发现程序本身是没问题的,第二张图片的效果虽然不是很明显,但基本还是能看到一些,对于第一张图片没能正常显示出来的原因在于(我个人的见解而已,我是一个初学图像者,这样的见解或许也不一定对,仅供参考):
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时图片的效果如下所示:
![](http://img.blog.csdn.net/20140526104537906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh5MTk4OTMz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第二种方法:修改阈值类型,我采用的是第五个类型,此时T=100,M=100,图片效果如下所示:
![](http://img.blog.csdn.net/20140526105027546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbHh5MTk4OTMz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这个小小的总结就到此了~~~~
#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,图片效果如下所示:
这个小小的总结就到此了~~~~
相关文章推荐
- 解决切换前后置摄像头时,本机不能正常显示前或后置摄像头图像的问题
- ThinkPHP(验证码不能正常显示) 图像“http://xxxxxxxxxxxxxxxx”因存在错误无法显示
- 使用opencv提取RGB图像的三个通道,并显示
- 笔记:OpenCV 读取摄像头并显示图像的R、G、B三个通道的直方图
- 解决mysql排序字段的数据为中文时不能正常显示结果的问题
- VS2012 中Find and Replace 结果不能正常显示问题
- webservices输出图像时不能正常显示
- MATLAB GUI 的一些小技巧(参数传递、结果显示、图像清除)
- Excel 此文档中包含宏、ActiveX 控件、XML扩展包信息或 Web组件,其中可能包含个人信息,并且这些信息不能通过‘文档检查器’进行删除。”
- 关于网页显示乱码问题的一些个人见解(PHP、JSP...)
- 网络状态都正常,ping 网关能ping通,但不正常,出现“?”,并且不能进行域名解析
- 网络状态都正常,ping 网关能ping通,但不正常,出现“?”,并且不能进行域名解析
- Blog技巧, 用JavaScript解决图像不能正常显示问题
- 针对php面试题中的问题的一些个人见解
- matplotlib不能正常显示图像
- 使用https时,网站一些内容不能正常显示的问题
- 编程产生一个int数组,长度为30,并向其中随机插入1-30,并且不能重复输出数组。实现一个冒泡排序算法对其进行排序,输出排序结果
- 在.net 环境下,进行了伪静态页面处理后,后台的Fckeditor就不能正常显示了
- 进行身份验证登录页面图片不能正常显示
- win7不能正常显示一些程序的图标