在一幅灰度影象中,我們可以把亮的那一部分比作山,暗的那一部分比作山谷,而邊緣就是山和山谷的相接的地方,這部分的灰度值會急劇的變化。如果在邊緣地方使用腐蝕操作,那麼和邊緣交接的亮的地方就會被0所替代,也就山的一部分變成了山谷,那麼山的高度就降低了。而膨脹的結果和這個相反。而水平地勢的地方,也就是山頂的平地不會被影響到。
利用這個原理我們就可以找到影象的邊緣。也就是找出腐蝕和膨脹後的影象的不同,結果就是邊緣。很明顯,如果我們使用的結構元素越大,那麼得到的邊緣就會越厚。由於我們是找出兩張的不同,就不需要處理二值影象了。
同樣的,拿腐蝕或者膨脹後的影象和原影象進行比較,也可以得到邊緣,並且邊緣更細一些。
在opencv中運算元cv::morphologyex(img, result, cv::morph_gradient, cv::mat()); 可以實現這個功能,函式名與開操作閉操作的相同,只是int op這個引數不同。
角點檢測比邊緣檢測要複雜一些,他需要使用四個結構元素。這四個結構元素是我們自己定義的。首先我們先將影象使用兩個不同的結構元素進行膨脹和腐蝕,結果就是,原有的影象平滑的邊緣沒有變化,而角點卻顯現出來,下面就是對一幅正方形白色影象愛說明一下,其中第乙個是原圖。
角點檢測示例
需要使用到的結構元素
當我們用乙個十字交叉(cross)的結構元素對影象進行膨脹操作時,只有角點的地方沒有膨脹。然後我們再利用菱形(diamond)結構元素對其進行腐蝕操作,邊緣的部分又回到了原來的位置,而角點卻顯現了出來。也可以使用x形狀和正方形(square)形狀的結構元素重複以上操作,可以看出這兩個結構元素是對上面兩個元素的旋轉45度形成的,因此它們可以用來檢測45度的角點。然後比較這兩個結果的不同便可以得出我們想要的角點。
檢測到的邊緣
//建立菱形
diamond.at(0, 0) = 0;
diamond.at(0, 1) = 0;
diamond.at(1, 0) = 0;
diamond.at(4, 4) = 0;
diamond.at(3, 4) = 0;
diamond.at(4, 3) = 0;
diamond.at(4, 0) = 0;
diamond.at(4, 1) = 0;
diamond.at(3, 0) = 0;
diamond.at(0, 4) = 0;
diamond.at(0, 3) = 0;
diamond.at(1, 4) = 0;
//建立x形
for (int i = 0; i < 5; i++)
}mat getedges(const mat &image)
void setthreshold(int t)
//需要連線使用這些結構元素,得到最終的角點對映圖
mat getcorners(const mat&image)
//為了視覺化,在在二值影象中每個監測點繪製乙個圓
void drawonimage(const mat & binary, mat & image) }
};int _tmain(int argc, _tchar* argv)
opencv學習筆記(9)邊緣保留濾波EPF
效果如下 濾波是由這個api決定的 dst cv.bilateralfilter image,0,50,10 經過調參發現,50和10的那兩個引數,越大,濾波之後的顯得更為 化。然後自己查資料,發現這位朋友總結的很好,發個鏈結 侵刪 高斯雙邊模糊引數解析 效果如下 起作用的api是這個 dst cv...
opencv學習 形態學
void cvdilate const cvarr src,cvarr dst,iplconvkernel element null,int iterations 1 void cverode const cvarr src,cvarr dst,iplconvkernel element null,...
opencv3 6 3形態學濾波 腐蝕 膨脹
數學形態 mathematical morpgology 這兩個操作針對的是對影象的高亮部分,而不是黑色部分 dilate 求區域性最大值的操作,膨脹或腐蝕操作從數學來講就是將影象與核進行卷積。核b與卷積,b覆蓋區域中畫素點最大值賦給a目標點,是影象中高亮區域逐漸增長。erode與膨脹是相反的操作,...