写了一段小程序,分享给大家!

//====================================================================
// 作者 : 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之邻域运算之最值滤波的更多相关文章

  1. opencv-11-中值滤波及自适应中值滤波

    开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...

  2. 基于Opencv的自适应中值滤波函数selfAdaptiveMedianBlur()

    7.3.3 自适应滤波器 自适应中值滤波器 对于7.3.2节所讨论的中值滤波器,只要脉冲噪声的空间密度不大,性能还是可以的(根据经验需Pa和Pb小于0.2).本节将证明,自适应中值滤波器可以处理更大概 ...

  3. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  4. opencv实现图像邻域均值滤波、中值滤波、高斯滤波

    void CCVMFCView::OnBlurSmooth()//邻域均值滤波 { IplImage* in; in = workImg; IplImage* out = cvCreateImage( ...

  5. opencv —— boxFilter、blur、GaussianBlur、medianBlur、bilateralFilter 线性滤波(方框滤波、均值滤波、高斯滤波)与非线性滤波(中值滤波、双边滤波)

    图像滤波,指在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像与处理中不可缺少的操作. 邻域算子,指利用给定像素及其周围的像素值,决定此像素的最终输出值的一种算子.线性邻域滤波器就是一种常 ...

  6. 学习 opencv---(8)非线性滤波:中值滤波,双边滤波

    正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...

  7. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  8. OpenCV成长之路:图像滤波

    http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...

  9. OpenCV探索之路(三):滤波操作

    滤波处理分为两大类:线性滤波和非线性滤波.OpenCV里有这些滤波的函数,使用起来非常方便,现在简单介绍其使用方法. 线性滤波:方框滤波.均值滤波.高斯滤波 方框滤波 #include<open ...

随机推荐

  1. OpenGL超级宝典第5版&&glProvokingVertex

    翻译:https://www.opengl.org/sdk/docs/man3/xhtml/glProvokingVertex.xml 方法原型:void glProvokingVertex(GLen ...

  2. 根据给定的日期给 dateEdit 控件增加颜色

    private void dateEdit1_DrawItem(object sender, DevExpress.XtraEditors.Calendar.CustomDrawDayNumberCe ...

  3. pycharm 源文件 编码格式

    pycharm 4.5.3 版本 修改项目的编码 按如下操作:菜单 File-Settings-Editor-File Encodings 将IDE Encoding 和 Project Encodi ...

  4. Java Thread.interrupt 害人! 中断JAVA线程(zz)

    http://www.blogjava.net/jinfeng_wang/archive/2012/04/22/196477.html#376322 ————————————————————————— ...

  5. POJ 1062 昂贵的聘礼 (最短路)

    昂贵的聘礼 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/M Description 年轻的探险家来到了一个印第安部落里.在那里 ...

  6. Spring入门(2)-通过构造器注入Bean

    Spring入门(2)-通过构造器注入Bean 前一篇文章将了最基本的spring例子,这篇文章中,介绍一下带有参数的构造函数和通过构造器注入对象引用. 0. 目录 带有参数的构造函数 通过构造器注入 ...

  7. stdlib.h 头文件

    stdlib 头文件即standard library标准库头文件.stdlib.h里面定义了五种类型.一些宏和通用工具函数. 类型例如size_t.wchar_t.div_t.ldiv_t和lldi ...

  8. thymeleaf中的Literals

    Literals即为文字 一.Text literals:文本文字 文本文字只是字符串指定的单引号之间.他们可以包含任何字符,但你应避免任何单引号里面\ ' <p> Now you are ...

  9. 13个Cat命令管理文件实例汇总

    在Linux系统中,大多数配置文件.日志文件,甚至shell脚本都使用文本文件格式,因此,Linux系统存在着多种文本编辑器,但当你仅仅想要查看一下这些文件的内容时,可使用一个简单的命令-cat. c ...

  10. 关于TCP主动关闭连接中的wait_timeout

    首先我们先来回顾一下tcp关闭连接的过程: 假设A和B连接状态为EST,A需要主动关闭: A发送FIN给B,并将状态更改为FIN_WAIT1, B接收到FIN将状态更改为CLOSE_WAIT,并回复A ...