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 ...
随机推荐
- Cadence原理图与Allegro交互
1:激活orCAD与Allegro的交互程序 打开原理图,Options->Preference在Miscellaneous里勾选 2:打开用到的工程 原理图,还有Allegro PCB Des ...
- HDU-4738 Caocao's Bridges 边联通分量
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:在有重边的无向图中,求权值最小的桥. 注意trick就好了,ans为0时输出1,总要有一个 ...
- RabbitMQ (五)主题(Topic) -摘自网络
虽然使用direct类型改良了我们的系统,但是仍然存在一些局限性:它不能够基于多重条件进行路由选择. 在我们的日志系统中,我们有可能希望不仅根据日志的级别而且想根据日志的来源进行订阅.这个概念类似un ...
- js滑动门及对像的使用
function scrollDoor() { } scrollDoor.prototype = { sd: function (menus, divs, openClass, closeClass) ...
- redis高级实用特性
1. 安全性 2. 主从复制 3. 事务处理 4. 持久化机制 5. 发布订阅消息 : 可以做一个消息系统 6. 虚拟内存的使用 一 . 安全性 设置客户端连接后进行任何其他指定前需要使用的密码 . ...
- 第三百零五天 how can I 坚持
今天去E世界拿抽的奖品,白去了 一趟,结果已经被拿过去了,明天还得去另一个地拿,太折腾了,今天走了1万4千多步. 哎,徐斌啊,出去见个面,这个折腾啊,受不了,想干他.开个玩笑. 黄东月,为什么打字莫名 ...
- 第二百九十八天 how can I 坚持
晚上和同学一块吃了个饭,聊了好多. 晚上回来的路上,突然想起一句话,现在又忘了. 睡觉. 人生平淡也好,光彩也罢,只是一个历程,算了,睡觉.
- 第二百五十九天 how can I 坚持
晚上,弟弟给我说了下他前几天发生的事,这孩子,有事就不知道说下,自己闷在心里. 刘松打算最近买房了,弟弟和建哥也考虑买,让他俩商量着来吧,早晚都得买. 有点揪心.想结婚不知道该和谁结... 睡觉.烦.
- DelphiXE Android的所有权限按照分类总结说明
相关资料:http://www.delphitop.com/html/Android/2778.html 网络相关的: android.permission.INTERNET 允许程序打开网络套接 ...
- CentOS 下安装操作Memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...