擊中擊不中的變換
1.1 擊中擊不中的步驟
擊中擊不中變換是形態學形狀檢測的基本工具。
步驟為:
- 使用模板s1腐蝕原影象X
- 使用模板s2(s2為是s1的補)對Y(Y為X的補)進行腐蝕
- 對兩個結果進行取交集
用擊中結構去腐蝕原始影象得到擊中結果X(這個過程可以理解為在原始影象中尋找和擊中結構完全匹配的模組,匹配上了之後,保留匹配部分的中心元素,作為腐蝕結果的一個元素),然後用擊不中結構去腐蝕原始影象的補集得到擊不中結果Y(即在原始影象上找到擊不中結構與原始影象沒有交集的位置,這個位置的元素保留,作為腐蝕結果的一個元素),取X和Y的交集就是擊中-擊不中的結果。 通俗理解就是:用一個小的結構元素(擊中結構)去射擊原始影象,擊中的元素保留;再用一個很大的結構元素(擊不中,一般取一個環狀結構)去射擊原始影象,擊不中原始影象的位置保留。滿足擊中元素能擊中and擊不中元素不能擊中的位置的元素就是最終的形狀結果。
1.2 擊中擊不中opencv實現
#include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main() { Mat input_image = imread("lena.jpg", 2); imshow("Hit or Miss原圖", input_image); Mat kernel1 = (Mat_<int>(3, 3) << 0, 1, 0, 1, -1, 1, 0, 1, 0); Mat kernel2 = (Mat_<int>(3, 3) << 0, 1, 0, 1, 0, 1, 0, 1, 0); Mat kernel3 = (Mat_<int>(3, 3) << 0, 0, 0, 0, 1, 0, 0, 0, 0); Mat output_image, output_image1,output_image2,output_image3,output_image4; Mat element = getStructuringElement(0, Size(3, 3), Point(-1, -1)); erode(input_image, output_image3, element); imshow("腐蝕圖", output_image3); morphologyEx(input_image, output_image1, MORPH_HITMISS, kernel3); morphologyEx(input_image, output_image2, MORPH_HITMISS, kernel2); morphologyEx(input_image, output_image, MORPH_HITMISS, kernel1); imshow("Hit or Miss0", output_image1); imshow("Hit or Miss1", output_image2); imshow("Hit or Miss", output_image); cv::absdiff(output_image1, output_image2, output_image4); cv::imshow("Hit or Miss2", output_image4); waitKey(0); return 0; }
Mat s1 = (Mat_<int>(3, 3) <<
0, 0, 0,
0, 1, 0,
0, 0, 0);
Mat s2 = (Mat_<int>(3, 3) <<
0, 1,
1, 0, 1,
0, 1, 0);
Mat s3 = (Mat_<int>(3, 3) <<
0, 1, 0,
1, -1, 1,
0, 1, 0);
s3是直接用s2-s1所得
1.3 擊中擊不中效果
圖1 原圖 圖2 使用s1腐蝕結果 圖3 使用s2腐蝕結果
圖4 圖3與圖2的交集 圖5 直接使用s3腐蝕的結果