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

//====================================================================
// 作者 : 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. MVC中的ActionResult

    ActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的是非ActionResult类型,控制器将会将结果转换为 ...

  2. [LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针

    一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of ...

  3. JavaIO(03)字节流--OutputStream and InputStream

    IO概述:   IO流用来处理设备之间的数据传输 java对数据的操作是通过流的方式 java用于操作流的对象都在IO包中 流按操作数据分为两种:字节流与字符流(编码表) 流按流向分为:输入流,输出流 ...

  4. codeforces 630KIndivisibility(容斥原理)

    K. Indivisibility time limit per test 0.5 seconds memory limit per test 64 megabytes input standard ...

  5. URAL 2066 Simple Expression (水题,暴力)

    题意:给定三个数,让你放上+-*三种符号,使得他们的值最小. 析:没什么好说的,全算一下就好.肯定用不到加,因为是非负数. 代码如下: #pragma comment(linker, "/S ...

  6. Serializable 序列化为文件

    package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

  7. K - 最少拦截系统

    Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不 能超过前一发的高度.某天,雷达 ...

  8. C#学习笔记(十六):Attribute

    Attribute可以为类或方法添加一些附加的信息,我们可以看看MSDN对Attribute的描述: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注 ...

  9. Unity3D之空间转换学习笔记(二):基础数学

    这期笔记我们专注Unity提供的各种数学相关的类来学习. 时间Time API文档地址:http://docs.unity3d.com/ScriptReference/Time.html 时间加/减速 ...

  10. C#多线程(上) 分类: C# 线程 2015-03-09 10:35 174人阅读 评论(0) 收藏

    一.多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行 ...