形态学操作
简单来讲,形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。
dilate
此操作将图像 ,通常为正方形或圆形,进行卷积。 内核 有一个可定义的 锚点, 通常定义为内核中心点。 进行膨胀操作时,将内核划过图像,将内核覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区[白色部分]开始”扩展”。
erode 腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。进行腐蚀操作时,将内核 划过图像,将内核 覆盖区域的最小相素值提取,并代替锚点位置的相素。以与膨胀相同的图像作为样本,我们使用腐蚀操作。
导致图像中的暗区[黑色部分]开始”扩展”。
效果图
效果图
代码演示:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int max_value = 2;
int erosion_size = 0;
int erosion_elem = 0;
int dilate_elem = 0;
int dilate_size = 0;
Mat src; Mat erosion_dst; Mat dilate_dst;
void myerode(int ,void*)
{
int erosion_type;
if (erosion_elem == 0) { erosion_type = MORPH_RECT; }
else if (erosion_elem == 1) { erosion_type = MORPH_CROSS; }
else if (erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; }
Mat element = getStructuringElement(erosion_type,
Size(2 * erosion_size + 5, 2 * erosion_size + 5),
Point(erosion_size, erosion_size));
/// 腐蚀操作
erode(src, erosion_dst, element);
imshow("myerode", erosion_dst);
}
void mydilate(int ,void*)
{
int dilate_type;
if (dilate_elem == 0) { dilate_type = MORPH_RECT; }
else if (dilate_elem == 1) { dilate_type = MORPH_CROSS; }
else if (dilate_elem == 2) { dilate_type = MORPH_ELLIPSE; }
Mat element = getStructuringElement(dilate_type,
Size(2 * dilate_size + 5, 2 * dilate_size + 5),
Point(dilate_size, dilate_size));
//
dilate(src, dilate_dst, element);
imshow("mydilate", dilate_dst);
}
int main()
{
src=imread("C:\\Users\\13658\\Desktop\\图片素材\\字母.jpg");
if(!src.data)
{
printf("can not find image file..\n");
return -1;
}
//erode trackbar
namedWindow("myerode", CV_WINDOW_AUTOSIZE);
createTrackbar("value","myerode",&max_value,max_value,myerode);
//&&max_value起始位置(所以需要赋指针) max_value valu的刻度最值
namedWindow("src",CV_WINDOW_AUTOSIZE);
imshow("src",src);
//dilate trackebar
namedWindow("mydilate", CV_WINDOW_AUTOSIZE);
createTrackbar("value", "mydilate", &max_value, max_value, mydilate);
myerode(0,0);
mydilate(0,0);
waitKey(0);
return 0;
}
网友评论