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 入门教程:中值滤波和双边滤波
OpenCV 入门教程:中值滤波和双边滤波 导语 一.中值滤波 二.双边滤波 三.示例应用 3.1 图像去噪 3.2 图像平滑 总结 导语 在图像处理和计算机视觉领域,中值滤波和双边滤波是两种常见的滤 ...
- 《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- Opencv之图像滤波:5.中值滤波(cv2.medianBlur)
之前介绍的均值滤波.方框滤波.高斯滤波,都是线性滤波方式.由于线性滤波的结果是所有像素值的线性组合,因此含有噪声的像素也会被考虑进去,噪声不会被消除,而是以更柔和的方式存在.这时使用非线性滤波效果可能 ...
- 图像平滑处理(归一化块滤波、高斯滤波、中值滤波、双边滤波)
图像平滑处理 目标 本教程教您怎样使用各种线性滤波器对图像进行平滑处理,相关OpenCV函数如下: blur GaussianBlur medianBlur bilateralFilter 原理 No ...
- 中值滤波(资料整理,持续更新)
中值滤波(Median Filter),用于图像的中值滤波最早是由美国普林斯顿大学的John Wilder Tukey教授提出来的.常见的线性滤波器,用于图像处理时,有可能导致细节模糊或破坏边缘,更关 ...
- 转载之-中值滤波均值滤波
转自:openCV之中值滤波&均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543 在开始我们 ...
- 图像处理:中值滤波均值滤波
转自:openCV之中值滤波&均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543 在开始我们 ...
- 图像处理中的均值滤波和中值滤波
在开始我们今天的博客之前,我们需要先了解一下什么是滤波: openCV之中值滤波&均值滤波(及代码实现)首先我们看一下图像滤波的概念.图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声 ...
- 【OpenCV 4开发详解】中值滤波
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
最新文章
- 【android】java.lang.NoClassDefFoundError或classnotfount等异常错误
- 华为,再牵手一流大学
- 东北大学 计算机网络试题,东北大学秦皇岛分校计算机网络考试试卷(含答案)
- ArcGIS API for Silverlight开发
- 大厂2020届实习生笔试题
- 在个人机上发布web项目
- Julia: 关于Github上的其它库
- mobi 转 pdf mobi格式转pdf格式 ePub azw3
- win10编译OpenCV4Android系列2-编译OpenCV4.5.2+opencv_contrib
- 朋友圈点赞截图在线生成源码
- Android Q 修改Fingerprint
- html怎样使图片自动旋转,css怎么让图片旋转?
- 只有10分,5分,2分,1分的硬币;顾客付款x分,商品价格y分。如何找零所使用的硬币最少(递归实现)
- vs单步调试及断点调试基本介绍
- 转Ruby on Rails的核心特性是什么
- win10关闭windows defender,CPU爆满问题
- App与H5交互的几种方式
- RXAndroid-exception:rx.exceptions.MissingBackpressureException
- 天下熙熙,皆为利来;天下攘攘,皆为利往。—第三十八天
- 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的