OpenCV形态学操作
一、概念
dilate(膨胀):
取所操作区域的最大值代替中心像素值(锚点),算子的移动与卷积操作相同。
erode(腐蚀):
取所操作区域的最小值代替中心像素值(锚点)。
形态学梯度:morphology gradient,膨胀减去腐蚀。
开操作:先腐蚀再膨胀
闭操作:先膨胀再腐蚀
顶帽:tophat,源图像与开操作的差值
黑帽:blackhat,闭操作图像与源图像的差值
二、验证代码
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat src, dst; src = imread("D:/iPhone/100APPLE/IMG_0070.JPG"); if (!src.data) { cout << "could not load image..." << endl; return -1; } char input_title[] = "input image"; char output_title[] = "output image"; namedWindow(input_title, CV_WINDOW_AUTOSIZE); imshow(input_title, src); Mat kernel = getStructuringElement(MORPH_RECT, Size(11, 11), Point(-1, -1)); morphologyEx(src, dst, CV_MOP_GRADIENT, kernel);//膨胀减去腐蚀,形态学梯度 morphologyEx(src, dst, CV_MOP_OPEN, kernel);//开操作,先腐蚀再膨胀(可记忆为最后膨胀开),适合去除一些亮斑 morphologyEx(src, dst, CV_MOP_CLOSE, kernel);//闭操作,先膨胀再腐蚀,适合去除一些暗斑 morphologyEx(src, dst, CV_MOP_TOPHAT, kernel);//源图像减去开操作图像,适合用于找到亮斑 morphologyEx(src, dst, CV_MOP_BLACKHAT, kernel);//闭操作减去源图像,适合用于找到暗斑 imshow(output_title, dst); waitKey(0); return 0; }