morphologyEx(src,dst,OPT,kernel)
OPT對應操作,分為以下幾類
CV_MOP_OPEN開操作
CV_MOP_CLOSE閉操作
CV_MOP_GRADIENT形態學梯度
CV_MOP_TOPHAT頂帽操作
CV_MOP_BLACKHAT黑帽操作
1.開操作
先腐蝕再膨脹
2.閉操作
先膨脹再腐蝕
3.形態學梯度
膨脹-腐蝕(也叫做基本梯度),形態學梯度還包括內部梯度和方向梯度
4.頂帽操作
原圖像與開操作的差值
5.黑帽操作
閉操作與原圖像的差值
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char **argv) { Mat src,dst_open,dst_close,dst_gra,dst_top,dst_black; src = imread("b.jpg"); if (src.empty()) { cout << "load image failed" << endl; return -1; } imshow("input img", src); Mat kernel = getStructuringElement(MORPH_RECT, Size(3,3), Point(-1, -1)); morphologyEx(src, dst_open, CV_MOP_OPEN, kernel); imshow("open", dst_open); morphologyEx(src, dst_close, CV_MOP_CLOSE, kernel); imshow("close", dst_close); morphologyEx(src, dst_gra, CV_MOP_GRADIENT, kernel); imshow("gradent", dst_gra); morphologyEx(src, dst_top, CV_MOP_TOPHAT, kernel); imshow("tophat", dst_top); morphologyEx(src, dst_black, CV_MOP_BLACKHAT, kernel); imshow("blackhat", dst_black); waitKey(0); return 0; }
6,水平線垂直線的提取
分為以下幾個步驟:
輸入彩色圖像
轉為灰度圖像
轉為二值圖像
adaptiveThreshould(src,dst,maxValue,adaptiveMethod,threshould,blocksize,c)
參數分別對應輸入圖像,輸出圖像,自適應方法(ADAPTIVE_THRESH_MEAN_C,ADAPTIVE_THRESH_GAUSSIAN_C),閾值類型,塊大小,常數c
定義結構元素
開操作提取水平線和垂直線(~表示取反操作)
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char **argv) { Mat src,dst; src = imread("d.jpg"); if (src.empty()) { cout << "load image failed" << endl; return -1; } imshow("input img", src); Mat gray_src; cvtColor(src, gray_src, CV_BGR2GRAY); imshow("gray", gray_src); Mat binImg; adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); imshow("binary img", binImg); //水平結構元素 Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 100, 1), Point(-1, -1)); //垂直結構元素 Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 100), Point(-1, -1)); /* Mat temp; erode(binImg, temp, wline); dilate(temp, dst, wline); */ morphologyEx(binImg, dst, CV_MOP_OPEN, hline); imshow("final result", dst); waitKey(0); return 0; }
利用形態學降噪
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char **argv) { Mat src,dst; src = imread("d.jpg"); if (src.empty()) { cout << "load image failed" << endl; return -1; } imshow("input img", src); Mat gray_src; cvtColor(src, gray_src, CV_BGR2GRAY); imshow("gray", gray_src); Mat binImg; adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2); imshow("binary img", binImg); //水平結構元素 Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 100, 1), Point(-1, -1)); //垂直結構元素 Mat wline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 100), Point(-1, -1)); Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1)); /* Mat temp; erode(binImg, temp, wline); dilate(temp, dst, wline); */ morphologyEx(binImg, dst, CV_MOP_OPEN, kernel); imshow("final result", dst); waitKey(0); return 0; }