OpenCV11膨胀与腐蚀的操作

/*
by:txwtech
膨胀与腐蚀:
作用:可以排除一些干扰,具体看图片处理效果
形态学操作(morphology operators)-膨胀
图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开、闭
膨胀与腐蚀是图像处理中最常用的形态学操作手段

 

形态学操作-腐蚀

腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值

取每个位置领域内的最小值,灰度较暗的区域面积随着增大,灰度较亮的区域面积就会减小

最小值:指的像素点的值,值越小越暗

 

形态学操作-膨胀(用最大的像素值替换中心像素)

取每个位置领域内的最大值,图像输出总体亮度比原图亮,图像中较亮物体的尺寸会变大,较暗物体的尺寸会减小,甚至消失

最大值:指的像素点的值,值越大越亮


跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,
其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,
其中B作为结构体可以是任意形状

//膨胀,黑圆右侧有些小点,通过膨胀,可以去除干扰

 

API:
getStructuringElement(int shape, Size ksize, Point anchor)
- 形状 (MORPH_RECT \MORPH_CROSS \MORPH_ELLIPSE)
- 大小
- 锚点 默认是Point(-1, -1)意思就是中心像素
dilate(src, dst, kernel)
erode(src, dst, kernel)

*/

/*
by:txwtech
膨胀与腐蚀:
作用:可以排除一些干扰,具体看图片处理效果
形态学操作(morphology operators)-膨胀
图像形态学操作 – 基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开、闭
膨胀与腐蚀是图像处理中最常用的形态学操作手段


*/
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat src;
Mat src2;
Mat src2a;//
Mat dst2;
Mat dst2a;
//设置结构元素大小
int element_size = 3;
int max_size = 21;
void CallBack_Demo(int, void*);//方法,函数
void CallBack_Demo2(int, void*);//方法,函数
char win_title[] = "原图";
char win_title1[] = "原图2";
char win_title2[] = "腐蚀的图";
char win_title3[] = "膨胀的图2";
int main(int argc, char *argv[])
{
	
	
	src = imread("E:\\pictures\\cow1a.jpg",CV_LOAD_IMAGE_ANYCOLOR);
	src2 = imread("E:\\pictures\\腐蚀sample.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	if (!src.data)
	{
		printf("src failed to load image");
		return -1;
	}
	if (!src2.data)
	{
		printf("src2 failed to load image");
		return -1;
	}
	
	namedWindow(win_title,CV_WINDOW_AUTOSIZE);
	namedWindow(win_title2, CV_WINDOW_AUTOSIZE);
	namedWindow(win_title1, CV_WINDOW_AUTOSIZE);
	namedWindow(win_title3, CV_WINDOW_AUTOSIZE);//腐蚀的图2

	imshow(win_title, src);
	imshow(win_title1, src2);
	
	
	createTrackbar("Element Size:", win_title2,&element_size,max_size,CallBack_Demo);
	createTrackbar("Element Size:", win_title3, &element_size, max_size, CallBack_Demo2);//腐蚀的图2
	CallBack_Demo(0,0);
	CallBack_Demo2(0, 0);

	//实现反色显示
	src2.copyTo(src2a);
	int height = src2a.rows;
	int width = src2a.cols;
	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{
			int gray_value = src2a.at<uchar>(row,col);
			src2a.at<uchar>(row, col) = 255 - gray_value;
		}
	}
	namedWindow("反色显示",CV_WINDOW_AUTOSIZE);
	imshow("反色显示", src2a);
	waitKey(0);

	return 0;
}
void CallBack_Demo(int, void*)
{
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT,Size(s,s),Point(-1,-1));
	//膨胀
	//dilate(src,dst2,structureElement,Point(-1,-1),1);
	//腐蚀
	erode(src,dst2,structureElement);//
	imshow(win_title2, dst2);
	return;
}
void CallBack_Demo2(int, void*)
{
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	//膨胀,黑圆右侧有些小点,通过膨胀,可以去除干扰
	dilate(src2,dst2a,structureElement,Point(-1,-1),1);
	//腐蚀
	//erode(src2, dst2a, structureElement);
	imshow(win_title3, dst2a);
	return;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

txwtech笛克特科

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值