OpenCV之邻域运算之最值滤波
写了一段小程序,分享给大家!
//====================================================================
// 作者 : quarryman
// 邮箱 : quarrying{at}qq.com
// 主页 : http://blog.csdn.net/quarryman
// 日期 : 2013年08月03日
// 描述 : 实现最值滤波,非最值抑制
//====================================================================
#include <cv.h>
#include <highgui.h>
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b)) CvRect kcvRectIntersection(CvRect rect1,CvRect rect2)
{
CvRect rect;
rect.x=max(rect1.x, rect2.x);
rect.y=max(rect1.y, rect2.y);
rect.width=min(rect1.x+rect1.width, rect2.x+rect2.width);
rect.width=rect.width-rect.x;
rect.height=min(rect1.y+rect1.height, rect2.y+rect2.height);
rect.height=rect.height-rect.y;
return rect;
} CvRect kcvGetRectFromCenterAndSize(int cx, int cy, int w, int h=0)
{
CvRect rect;
rect.x=cx-(w>>1);
rect.y=cy-(h>>1);
rect.width=w;
rect.height=(h==0?w:h);
return rect;
} int minValue(IplImage* img,CvRect rect)
{
uchar minval=255;
for(int i=rect.y;i<rect.y+rect.height;++i)
{
for(int j=rect.x;j<rect.x+rect.width;++j)
{
if(CV_IMAGE_ELEM(img,uchar,i,j)<minval)
{
minval=CV_IMAGE_ELEM(img,uchar,i,j);
}
}
}
return minval;
} int maxValue(IplImage* img,CvRect rect)
{
uchar maxval=0;
for(int i=rect.y;i<rect.y+rect.height;++i)
{
for(int j=rect.x;j<rect.x+rect.width;++j)
{
if(CV_IMAGE_ELEM(img,uchar,i,j)>maxval)
{
maxval=CV_IMAGE_ELEM(img,uchar,i,j);
}
}
}
return maxval;
} enum
{
KCV_MAX, // 最大值滤波器,类似于形态学膨胀
KCV_MIN, // 最小值滤波器,类似于形态学腐蚀
KCV_NMS_MAX, // 非最大值抑制
KCV_NMS_MIN // 非最小值抑制
}; void maxminFilter(IplImage* src,IplImage* dst,int width,int height=0,int mode=KCV_MAX)
{
for(int j=0;j<src->width;++j)
{
for(int i=0;i<src->height;++i)
{
CvRect rect1=cvRect(0,0,src->width,src->height);
CvRect rect2=kcvGetRectFromCenterAndSize(j,i,width,height);
CvRect rect=kcvRectIntersection(rect1,rect2);
switch(mode)
{
case KCV_MAX:
CV_IMAGE_ELEM(dst,uchar,i,j)=maxValue(src,rect);
break;
case KCV_MIN:
CV_IMAGE_ELEM(dst,uchar,i,j)=minValue(src,rect);
break;
case KCV_NMS_MAX:
if(CV_IMAGE_ELEM(src,uchar,i,j)!=maxValue(src,rect))
{
CV_IMAGE_ELEM(dst,uchar,i,j)=0;
}
else
{
CV_IMAGE_ELEM(dst,uchar,i,j)=CV_IMAGE_ELEM(src,uchar,i,j);
}
break;
case KCV_NMS_MIN:
if(CV_IMAGE_ELEM(src,uchar,i,j)!=minValue(src,rect))
{
CV_IMAGE_ELEM(dst,uchar,i,j)=255;
}
else
{
CV_IMAGE_ELEM(dst,uchar,i,j)=CV_IMAGE_ELEM(src,uchar,i,j);
}
break;
}
}
}
} int main()
{
IplImage* src=cvLoadImage("lena.jpg",0);
IplImage* dst=cvCreateImage(cvGetSize(src),8,1);
cvNamedWindow("original image");
cvShowImage("original image",src); maxminFilter(src,dst,5,5,KCV_MAX);
cvNamedWindow("maximum filter");
cvShowImage("maximum filter",dst);
cvSaveImage("maximum filter.jpg",dst); maxminFilter(src,dst,5,5,KCV_MIN);
cvNamedWindow("minimum filter");
cvShowImage("minimum filter",dst);
cvSaveImage("minimum filter.jpg",dst); maxminFilter(src,dst,5,5,KCV_NMS_MAX);
cvNamedWindow("non-maximum suppression");
cvShowImage("non-maximum suppression",dst);
cvSaveImage("non-maximum suppression.jpg",dst); maxminFilter(src,dst,5,5,KCV_NMS_MIN);
cvNamedWindow("non-minimum suppression");
cvShowImage("non-minimum suppression",dst);
cvSaveImage("non-minimum suppression.jpg",dst); cvWaitKey(0);
cvDestroyAllWindows();
cvReleaseImage(&src);
cvReleaseImage(&dst); return 0;
}
最大值滤波结果:
最小值滤波结果:
非最大值抑制结果:
非最小值抑制结果:
OpenCV之邻域运算之最值滤波的更多相关文章
- opencv-11-中值滤波及自适应中值滤波
开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...
- 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()
7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...
- OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...
- opencv实现图像邻域均值滤波、中值滤波、高斯滤波
void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...
- opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)
图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...
- 学习 opencv---(8)非线性滤波:中值滤波,双边滤波
正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...
- Atitit 图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)
Atitit 图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...
- OpenCV成长之路:图像滤波
http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...
- OpenCV探索之路(三):滤波操作
滤波处理分为两大类:线性滤波和非线性滤波.OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法. 线性滤波:方框滤波.均值滤波.高斯滤波 方框滤波 #include<open ...
随机推荐
- 常见设计模式解析和实现(C++)Prototype模式(原型模式)
作用:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML结构图: 抽象基类: 1) Prototype:虚拟基类,所有原型的基类,提供Clone接口函数 接口函数: 1) P ...
- 使用PHP绘制统计图
使用PHP画统计图的方法 第一种方法 <?php //最后一次修改:2004-6-21 //一个生成矩形图,曲线图的图形分析类 //作者:tonera //说明: //任何人可在任何场合自由使用 ...
- The solution to Force.Com IDE 29.0 PassWord Problem
我最近使用Force.com IDE 时,经常提示密码错误.从Google 中终于发现一个解决方法,分享给大家,以供大家参考. 在Force.com IDE 29.0中,IDE 存储我们开发Org ...
- 启动程序的同时传参给接收程序(XE8+WIN764)
相关资料: http://blog.csdn.net/yanjiaye520/article/details/7590252 注意事项: 1.ParamStr(0)是实例自己. 2.传的参数是以空格分 ...
- UVALive 7279 Sheldon Numbers (暴力打表)
Sheldon Numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/127406#problem/H Description According t ...
- ActiveMQ学习笔记(二) JMS与Spring
上文可见,JMS Native API使用起来不是特别方便.好在Spring提供了很好的JMS支持. (一)配置ConnectionFactory 如果使用连接池的话,不要忘记activemq-poo ...
- 【Todo】ipcs命令学习
可以先看这一篇 http://www.jb51.net/article/40805.htm
- 来自JavaScript Garden摘取
1.数字类型不能用作对象,因为javascript解析器会将点号(.)解析成浮点型(as a floating point literal),比如:2.toString();会导致语法从错误,解决方法 ...
- vs2012下安装VisualHG
好久没写东西了.懒了.最近开发用到HG,记录一下.希望对用这个的有用 http://visualhg.codeplex.com/ 这里下载 VisualHG 安装完默认情况下 源代码管理出不来Visu ...
- iOS UIButton EdgeInsets
说一下系统的button,image 和 title的位置关系 默认image 和 title的位置关系: 随便画了草图,有点丑,不过不妨碍理解: 第一种:在button上只设置文字,这个时候,but ...