操作目的
HitMiss變換是形態檢測的一個工具,通過定義形狀模板可以在圖像中獲取同一形狀物體的位置坐標。
算法講解
1、用擊中結構去腐蝕原始圖像得到擊中結果X(這個過程可以理解為在原始圖像中尋找和擊中結構完全匹配的模塊,匹配上了之后,保留匹配部分的中心元素,作為腐蝕結果的一個元素)。
2、用擊不中結構去腐蝕原始圖像的補集得到擊不中結果Y(即在原始圖像上找到擊不中結構與原始圖像沒有交集的位置,這個位置的元素保留,作為腐蝕結果的一個元素)。
3、取X和Y的交集就是擊中-擊不中的結果。
通俗理解就是:用一個小的結構元素(擊中結構)去射擊原始圖像,擊中的元素保留;再用一個很大的結構元素(擊不中,一般取一個環狀結構)去射擊原始圖像,擊不中原始圖像的位置保留。滿足擊中元素能擊中and擊不中元素不能擊中的位置的元素就是最終的形狀結果。
舉例說明
公式進一步推廣:
實現代碼
*--------------------------【練習形態學操作】-------------------------------------*/
//===========================HitMiss變換========================
//輸入:待處理圖像的灰度圖
//參數:變換模板D和W
//輸出:模板位置的坐標圖
void My_HitMissChange(Mat& srcImage, Mat& dstImage, Mat& D,Mat &W_SUB_D)
{Mat binaryMat, binaryMat_inv;Mat pic1, pic2;//第一步(將原圖二值化并獲取補圖像)byte thre = My.My_Ostu(&srcImage);threshold(srcImage,binaryMat,thre, 255, 0); //原圖二值圖threshold(srcImage, binaryMat_inv, thre, 255, 1);//二值圖的補//用D對A腐蝕morphologyEx(binaryMat,pic1,MORPH_ERODE,D);//用(W-D)對A(補)腐蝕morphologyEx(binaryMat_inv, pic2, MORPH_ERODE, W_SUB_D);//取pic1與pic2的交集dstImage = pic1 & pic2;
}
根據需要自己定制矩陣D核矩陣W-D。
知識拓展:
opencv庫函數調用方法:
morphologyEx(input_image, output_image, MORPH_HITMISS, kernel);