您的位置:首页 > 其它

图像处理——滤波、膨胀腐蚀

2014-04-03 17:11 113 查看
1.双边滤波

可以保留边缘。基于空间距离及亮度差值的滤波。可用在图像分割。

彩色图片中的亮度差值的计算是计算各颜色分量差值加权求和得到。

2.膨胀与腐蚀

膨胀:核B与图像A卷积,计算核B覆盖区域的最大值。可使高亮区域逐渐增长。

腐蚀:计算核B覆盖区域的最小值。可是高亮区域减小。

膨胀可以填补凹洞,找连通分支(一个大的区域可能被噪声分割,膨胀操作可以使这些部分连通在一起)。使亮的区域得到扩展和连接。

腐蚀可以消除图像中的“斑点”噪声,使亮度区域被隔离并且缩小。

3.更通用的形态学处理

开运算:先腐蚀后膨胀。去除小的明亮区域,并且剩余的明亮区域被隔绝,但其大小不变。

闭运算:先膨胀再腐蚀。消除低亮度点值的孤立点。

形态学梯度:膨胀减去腐蚀。留下完整的外围边缘。

礼帽:原图减去其开运算。突出局部亮度极大点。

黑帽:原图减去其闭运算。突出局部亮度极小点。

#include"cv.h"
#include"highgui.h"
#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
IplImage* img_pre=cvLoadImage("C:\\Users\\dell\\Desktop\\test1.jpg",1);
IplImage**imgs=(IplImage **)calloc(5,sizeof(IplImage*));
imgs[0]=img_pre;
for(int i=0;i<4;i++)
{
IplImage* img=imgs[i];
imgs[i+1]=cvCreateImage(cvGetSize(img_pre),img_pre->depth,img_pre->nChannels);
cvSmooth(imgs[i],imgs[i+1],CV_BILATERAL,3,0,50.0,5.0);//双边滤波,3为滤波器大小3*3,0为无效参数,10.0为颜色sigma,5.0为距离sigma
}
cvNamedWindow("img_pre",CV_WINDOW_AUTOSIZE);
cvShowImage("img_pre",img_pre);
cvNamedWindow("img_smooth1",CV_WINDOW_AUTOSIZE);
cvShowImage("img_smooth1",imgs[1]);
cvNamedWindow("img_smooth2",CV_WINDOW_AUTOSIZE);
cvShowImage("img_smooth2",imgs[2]);
cvNamedWindow("img_smooth3",CV_WINDOW_AUTOSIZE);
cvShowImage("img_smooth3",imgs[3]);
cvNamedWindow("img_smooth4",CV_WINDOW_AUTOSIZE);
cvShowImage("img_smooth4",imgs[4]);
cvWaitKey(0);
cvReleaseImage(&img_pre);
free(imgs);//释放
cvDestroyWindow("img_pre");
cvDestroyWindow("img_smooth1");
cvDestroyWindow("img_smooth2");
cvDestroyWindow("img_smooth3");
cvDestroyWindow("img_smooth4");
}

注意开辟一段内存存储多幅图片的方法

#include "highgui.h"
#include<cv.h>
int main()
{
IplImage* img1=cvLoadImage("C:\\Users\\dell\\Desktop\\img1.jpg");
IplImage* img2=cvLoadImage("C:\\Users\\dell\\Desktop\\img2.jpg");
IplImage* img1_gray=cvCreateImage(cvGetSize(img1),img1->depth,1);
cvCvtColor(img1,img1_gray,CV_RGB2GRAY);
IplImage* img2_gray=cvCreateImage(cvGetSize(img2),img2->depth,1);
cvCvtColor(img2,img2_gray,CV_RGB2GRAY);
IplImage* diff=cvCreateImage(cvGetSize(img1),img1->depth,1);
cvAbsDiff(img1_gray,img2_gray,diff);//两张图片相减获得掩码
cvShowImage("diff",diff);
cvWaitKey(0);
IplImage* diff_thr=cvCreateImage(cvGetSize(img1),img1->depth,1);
cvThreshold(diff,diff_thr,55,255,CV_THRESH_BINARY);//二值化去噪
cvNamedWindow("diff_thr",1);
cvShowImage("diff_thr",diff_thr);
cvWaitKey(0);
cvMorphologyEx(diff_thr,diff_thr,NULL,NULL,CV_MOP_OPEN,1);//开操作去噪
cvNamedWindow("diff_thr_OPEN",1);
cvShowImage("diff_thr_OPEN",diff_thr);
cvWaitKey(0);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: