一、设置结构元素:getStructuringElement
图像处理经常要用到形态学操作,其中首先要获取结构元素。包括结构元素的大小及形状。
OpenCV提供了一个函数getStructuringElement,可以获取常用的结构元素的形状:矩形(包括线形)、椭圆(包括圆形)及十字形。
C++:Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1)); |
Python: cv2.getStructuringElement(shape, ksize[, anchor]) → retval |
第一个参数:结构单元的形状。第二个参数:结构参数的尺寸。第三个参数:锚点位置(默认结构单元的中心)
(1)shape:
MORPH_RECT:矩形
MORPH_ELLIPSE:椭圆
MORPH_CROSS:十字形
(2)ksize:
核大小
(3)Point(x,x):
结构元的大小
二、设置相应的操作
2.1 膨胀、腐蚀
腐蚀: erode(srcImage, dstImage, element); imshow("图片名", 待显示照片); 膨胀: dilate(待处理图片, 处理好的图片名字, 结构元); |
2.1.1腐蚀的作用
1、边缘检测。
2、噪声滤除。
3、形态骨架提取。
这一操作可以扩大低像素值区域。相当于”最小值“滤波器
2.1.2膨胀的作用
将卷积核B滑过图像A,找出卷积核区域内最大像素值作为锚点像素值。这一操作可以缩小低像素值区域。相当于“最大值”滤波器
膨胀腐蚀的函数实现:
https://blog.csdn.net/hx1298234467/article/details/48677737
2.2 开运算、闭运算、形态梯度...
void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() ) |
src:输入图像
dst:结果图像
op:操作
MORPH_OPEN开运算:先对图像腐蚀,再膨胀
MORPH_CLOSE闭运算:先膨胀再腐蚀
MORPH_GRADIENT形态梯度:膨胀图和腐蚀图之差
MORPH_TOPHAT顶帽:原图和开运算图之差
MORPH_BLACKHAT黑冒:闭运算结果和原图之差
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main(int argc, char* argv[]){
const char* path = "";
Mat img = imread(path);
if (!img.data){
cout << "Wrong Image" << endl;
return -1;
}
Mat kern = getStructuringElement(MORPH_RECT, Size(5, 5));
Mat erosion_img, dilate_img;
//腐蚀
erode(img, erosion_img, kern);
//膨胀
dilate(img, dilate_img, kern);
imshow("original image", img);
imshow("erosion image", erosion_img);
imshow("dilate image", dilate_img);
Mat open_mat, close_mat, gradient_mat, tophat_mat, blackhat_mat;
morphologyEx(img, open_mat, MORPH_OPEN, kern);
morphologyEx(img, close_mat, MORPH_CLOSE, kern);
morphologyEx(img, gradient_mat, MORPH_GRADIENT, kern);
morphologyEx(img, tophat_mat, MORPH_TOPHAT, kern);
morphologyEx(img, blackhat_mat, MORPH_BLACKHAT, kern);
imshow("Opening", open_mat);
imshow("Closing", close_mat);
imshow("Grandient", gradient_mat);
imshow("Tohat", tophat_mat);
imshow("Black", blackhat_mat);
cvWaitKey(0);
return 0;
}
参考: