opencv python图像处理opencv的一个小问题?

【小白学OpenCV】(1): 图像处理之低通滤波
在图像处理或者计算机视觉应用中,在正式对图像进行分析处理前一般需要一个预处理的过程。预处理是对图像作一些诸如降维、降噪的操作,主要是为后续处理提供一个体积合适的、只包含所需信息的图像。这里通常会用到一些滤波处理手法。滤波,实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号,其中像素点灰度值的高低代表信号的强弱。对应的高低频的意义:
高频:图像中灰度变化剧烈的点,一般是图像轮廓或者是噪声。
低频:图像中平坦的,灰度变化不大的点,图像中的大部分区域。
根据图像的高频与低频的特征,我们可以设计相应的高通与低通滤波器,高通滤波可以检测图像中尖锐、变化明显的地方;低通滤波可以让图像变得光滑,滤除图像中的噪声。OpenCV中提供的低通滤波有:线性的均值滤波器、高斯滤波器,非线性的双边滤波器、中值滤波器;高通滤波有基于Canny,Sobel等各种边缘滤波。这里大家可以看到低通滤波和高通滤波其实是相互矛盾的,但很多时候在做边缘检测前我们又需要进行低通滤波来降噪,这里就需要调节参数在保证高频的边缘不丢失的前提下尽可能的多去除图片的噪点。
线性滤波器
线性滤波器可以看做是用一个矩阵(滤波器的核)完整扫过源图片得到新图像,其中扫描的方式称为卷积。这里先介绍下核和卷积这两个概念。
核 说白了就是一个固定大小的数值矩阵。该数组带有一个锚点 ,一般位于矩阵中央,如下图的-4。核可以是OpenCV已经定义好的均值滤波器核和高斯滤波器核,也可以自定义核。
卷积 的计算方法其实也很简单:
将核的锚点放在该特定位置的像素上,同时,核内的其他值与该像素邻域的各像素重合;将核内各值与相应像素值相乘,并将乘积相加;将所得结果放到与锚点对应的像素上;对图像所有像素重复上述过程。
用公式表示上述过程如下:
下图为例,核锚点在中央,锚点放在源图红色区96的位置,分别相乘后求和,得到92为滤波后图像的值。这里对比结果图和源图,可以发现源图四周一圈的像素点已经丢失了,这里OpenCV提供的函数会自动帮我们补齐周围一圈使得源图和结果图尺寸一样。
知道原理之后,再来看看常用的滤波和如何自定义线性滤波器吧。
blur( src, dst, size, anchor = Point(-1,-1), borderType);
这个滤波是一个平滑图像的滤波器,它用一个点邻域内像素的平均灰度值来代替该点的灰度,看它的核就很容易理解了:
cv::GaussianBlur(src, dst, cv::Size(5,5), 1.5);
上面的均值滤波的平滑原理是用邻域内的平均值来代替当前的灰度值,但是我们往往希望越靠近该像素的点提供越高的权重,这样就产生了高斯模糊滤波。它的核是一个高斯分布的二维矩阵,中间大,向四周逐渐减小。
自定义线性滤波器
我们还可以自己设计核来完成个性化的滤波需求,根据原理我们也可以自己编程遍历图像像素做卷积求得结果,但更安全方便的方法是使用OpenCV函数 filter2D 创建自己的线性滤波器。
filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
前面的滤波都是模糊处理的,比如现在需要锐化图像,那可以很简单的设置一个核为即可。
非线性滤波
中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替。比如上图源图的红色区域里,中值是96,所以结果图中该点的值为96。
非双边滤波
双边滤波是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。这个滤波器相对复杂,具体原理可以看这位学姐的解释。http://blog.csdn.net/abcjennifer/article/details/7616663
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)opencv对一幅图像进行一次缩放处理并进行边缘检测
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
IplImage *doPyrDown(IplImage*in,int
filter=IPL_GAUSSIAN_5x5)
&assert(in-&width%2==0&&in-&height%2==0);
&out=cvCreateImage(
&&cvSize(in-&width/2,in-&height/2),
&in-&depth,
&in-&nChannels
&cvPyrDown(in,out);
&//cvNamedWindow("hh",0);
&//cvShowImage("hh",out);
&//cvWaitKey(0);
&//cvReleaseImage(&out);
&//cvDestroyWindow("hh");
&return (out);
IplImage* doCanny(
IplImage * in,
double lowThresh,
double highThresh,
double aperture)
{if(in-&nChannels!=1)//如果不是单通道图像,就返回0.即:只能处理单通道图像&
return (0);
IplImage*out=cvCreateImage(cvSize(in-&width,in-&height),IPL_DEPTH_8U,1);//将单通道图像的通道数置为1,深度8位&
cvCanny(in,out,lowThresh,highThresh,aperture);//函数的第二及第三个参数为两个阈值。小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割
//cvNamedWindow("jeiguo",1);
//cvShowImage("jieguo",out);
//cvWaitKey(0);
//cvReleaseImage(&out);
//cvDestroyWindow("jieguo");
return (out);
int main(int argc,char **argv)
*img=cvLoadImage("E:\\study\\matlab~\\work\\lena.jpg",0);
&cvShowImage("yuantu",img);
&out=doPyrDown(img);
&out=doCanny(out,10,100,3);
&//cvNamedWindow()
cvNamedWindow("jeiguo",1);
cvShowImage("jieguo",out);
cvWaitKey(0);
cvReleaseImage(&out);
cvDestroyWindow("jieguo");
&cvReleaseImage(&img);
&return 0;
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。关于图像和视频处理中opencv的问题
[问题点数:40分,结帖人lihonglu923]
关于图像和视频处理中opencv的问题
[问题点数:40分,结帖人lihonglu923]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年1月 VC/MFC大版内专家分月排行榜第二
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
2015年1月 VC/MFC大版内专家分月排行榜第二
2012年4月 VC/MFC大版内专家分月排行榜第一
2012年5月 VC/MFC大版内专家分月排行榜第二2012年3月 VC/MFC大版内专家分月排行榜第二2011年7月 VC/MFC大版内专家分月排行榜第二2011年1月 VC/MFC大版内专家分月排行榜第二2010年12月 VC/MFC大版内专家分月排行榜第二2010年9月 VC/MFC大版内专家分月排行榜第二2010年6月 VC/MFC大版内专家分月排行榜第二2010年5月 VC/MFC大版内专家分月排行榜第二2010年4月 VC/MFC大版内专家分月排行榜第二
匿名用户不能发表回复!|3600人阅读
《OpenCV学习笔记》(63)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【问题一】程序重复运行(当代码正在运行时,没关终端,改完代码,又去运行程序,就会报这个错,)
HIGHGUI ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
VIDIOC_STREAMON: Bad file descriptor
Unable to stop the stream.: Bad file descriptor
--(!) No captured frame -- Break!Press &RETURN& to close this window...
解决方法:把前面正在运行的终端关掉再运行下一个代码。
【问题2】未插摄像头(有可能为0,也有可能为1)
HIGHGUI ERROR: V4L: index 1 is not correct!
【问题3】输入视频显示问题
症状一:明明是输入视频它却只显示一帧图片,还以为卡了
药方一:可能是定义视频帧Mat对象frame的时候定义在while循环外头了,所以他只显示第一帧图片,把视频帧Mat对象frame定义在while循环里就可以了。
if(!capture.isOpened())
cout&&"Capture is not open!!!! "&&
return -1;
药方二:也有可能是延时出现了问题,不是waitKey(0),改成其他大于0的数,像这样:waitKey(3);
有问题,欢迎私信!
我的邮箱:
文章:20篇
阅读:21066}

我要回帖

更多关于 基于opencv的图像处理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信