图片的开操作
图片的开操作
- 开 = 腐蚀 + 膨胀
- 用于保留原结构, 去除干扰块
opencv中有相关的API
CV_EXPORTS_W 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() );
当op参数为 MORPH_OPEN 就是一次开操作
For instance, an opening operation (#MORPH_OPEN) with two iterations is equivalent to apply
successively: erode -> erode -> dilate -> dilate (and not erode -> dilate -> erode -> dilate)
我自定义了一次:erode -> dilate
void morphologyOpenDemo(Mat& original, int shape, cv::Size size, cv::Point anchor);
void morphologyOpenDemo(Mat& original,int shape,cv::Size size,cv::Point anchor)
{
if (original.empty())
{
cout << " can`t get this ph" << endl;
}
namedWindow("open_source_win",WINDOW_FREERATIO);
imshow("open_source_win",original);
Mat kernel = getStructuringElement(shape, size, anchor);
Mat erode_result;
erode(original, erode_result, kernel);
Mat dst;
dilate(erode_result, dst, kernel);
namedWindow("open_dst_win", WINDOW_FREERATIO);
imshow("open_dst_win", dst);
}
实验效果:
图片前后结构基本不变,画框部分干扰部分已经去除。
直接调用的结果示意图:
这里我迭代了两次,干扰部分基本完全消失。
Mat dst;
morphologyEx(src,dst,MORPH_OPEN,kernel,Point(-1,-1),2);
imshow("open_dst", dst);
开操作 提取细节(顶帽)
- 细节 = 原图 -开操作
Mat tophat;
morphologyEx(src, tophat, MORPH_TOPHAT, kernel);
imshow("tophat_win", tophat);
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
Mat dst;
morphologyEx(src,dst,MORPH_OPEN,kernel,Point(-1,-1),2);
imshow("open_dst", dst);
Mat detail;
subtract(src,dst,detail);
imshow("open_detail", detail);
开操作去除干扰
先二值化然后开操作,这里二值化可以随意选择Canny之类,类梯度都可以。
Mat gray, binary;
cvtColor(src, gray, COLOR_BGR2GRAY);
threshold(gray,binary,0,255,THRESH_BINARY_INV|THRESH_OTSU);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
imshow("binary_win", binary);
Mat dst;
morphologyEx(binary, dst, MORPH_OPEN, kernel, Point(-1, -1), 1);
imshow("dst_win",dst);
实验效果:
本节代码地址:https://github.com/cyssmile/openCV_learning_notes/blob/master/opencv_test/opencv_036/opencv_036.cpp