图像的形态学操作——基于形状的一系列的图像处理操作合集
形态学的四个基本操作:膨胀、腐蚀、开、闭
1. 膨胀dilate
B覆盖下的A中最大像素值代替锚点像素,像素值整体变大
结构型元素定义:
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
shape-可以是矩形,也可以是椭圆等 通过MORPH_*查看
ksize-是结构型元素大小
anchor-默认是(-1,-1)中心
膨胀操作:
void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
kernel-就是定义的结构型元素
iterations-迭代运行几次
2. 腐蚀erode
B覆盖下的A中最小像素值代替锚点像素,像素值整体变小
void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1,-1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultBorderValue() );
demo:
#include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; Mat src, d_dst, r_dst, dst, bt_dst; char OUTPUT[] = "dilate image"; int element_size = 3; int max_size = 15; void CallBack_Demo(int, void*); int main(int argc, char** argv) { src = imread("D:/learning/image/5.jpg", WINDOW_AUTOSIZE); if (src.empty()) { printf("can not found image...\n"); return -1; } namedWindow(OUTPUT); //设置拖动滑块控制size大小 createTrackbar("Element size:", OUTPUT, &element_size, max_size, CallBack_Demo); CallBack_Demo(0, 0); waitKey(0); return 0; } // void CallBack_Demo(int, void*) { int s = element_size * 2 + 1; //定义结构型元素 Mat structure_element = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); //dilate(src, dst, structure_element, Point(-1, -1), 1); //膨胀 erode(src, dst, structure_element, Point(-1, -1), 1); //腐蚀 imshow(OUTPUT, dst); return; }
其中createTrackbar函数创建一个滑块,用来控制膨胀腐蚀操作中的参数,效果如下图所示:
3. 开open