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 ...
随机推荐
- Struts2动态调用DMI及错误解决方法
在Strust2中action可以定义自己的方法,调用方法有两种方式,一种方式是struts.xml中指定method来表示需要用到的方法, 但是这种方法缺点在于如果你的Action中有很多方法则要多 ...
- 【跟我一起学Python吧】python学习摘要
开始靖,怒推一篇文章:码农平时应该注意的办公室礼节 学习一门脚本语言是很有必要的,当我们在开发一些简单,快速程序时,脚本语言便有了用武之地,而且还很給力.根据python的介绍,python是一门很简 ...
- Java-note-输入流
java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner.实例程序:一,利用 Scanner 实现从键盘读入integer ...
- 【移动开发】安卓Lab2(02)
Design UI 总共有三个activity 1. MainActitivty: search bar:先用edittext来代替 map:用imageview装图片 2. DetailActiti ...
- post和put的区别
post : 标识的是处理请求中资源表述的资源 put : 标识的是请求的资源表述 post : 支持多种类型的资源 put : 支持单一的资源
- BAT-使用BAT方法结束进程(删除进程)
@echo off taskkill /f /im GAM.exe taskkill /f /im GCL10.exe
- #c word转换PDF
需要引用Microsoft.Office.Interop.Word,版本是07之上的. 这个版本会判断文件是否被占用. using Microsoft.Office.Interop.Word; usi ...
- Linux递归删除文件命令
Linux递归删除文件命令 find . -name "*.log.*" -exec ls {} \; find . -name "*.log.*" -exec ...
- HDU1518 Square
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #de ...
- codeforces 630D Hexagons!
D. Hexagons! time limit per test 0.5 seconds memory limit per test 64 megabytes input standard input ...