基本形态学算法
基本形態(tài)學(xué)算法 為什么要做基本形態(tài)學(xué)算法的研究和實(shí)現(xiàn)?是因?yàn)樾螒B(tài)學(xué)是一個(gè)非常有力,應(yīng)用 廣泛的工具,但同時(shí)也是研究不是很清楚的工具。往往一個(gè)恰到好處的變換,就能夠省下許多的勞動。對此的分類和研究就顯得非常有必要,而相關(guān)代碼的積累,也很有價(jià)值。 零、基本概念: 膨脹:白->黑; ? ?dilate 腐蝕:黑->白; ?erode 開 ? ?: 腐蝕->膨脹 平滑物體輪廓,斷開較窄的地方,清除細(xì)突; 閉 ? :膨脹->腐蝕 彌合較窄的間斷,填補(bǔ)細(xì)長的溝壑; 頂帽 :src-(開運(yùn)算(src)) 底帽 :閉運(yùn)算(src)-src 一、邊界提取 先腐蝕,然后相減。 作為生成算法可能價(jià)值不是很大,但是在生成鏤空字符的時(shí)候,價(jià)值就會比較大。 變成以及 //-------------------生成驗(yàn)證碼--------------//
void?creatCode()
{
????Mat?edge;
????Mat?code?=?imread("abcd123.bmp",0);
????threshold(code,code,0,255,THRESH_OTSU);
????threshold(code,code,0,255,THRESH_BINARY_INV);
????dilate(code,code,Mat(1,5,CV_8U));
????erode(code,edge,Mat());
????edge?=?code?-?edge;
????imshow("驗(yàn)證碼生成",code);
}
//-------------------邊界提取----------------//
void?getEdge(Mat?src)
{
????Mat?edge?;
????erode(src,edge,Mat());
????edge?=?src?-?edge;
????imshow("邊界提取",edge);
} 二、孔洞填充(注意,floodfill是沒有教程的) 一個(gè)孔洞可以被定義為由前景像素相連接的邊界所包圍的一個(gè)背景區(qū)域。關(guān)鍵是標(biāo)注出區(qū)域中的點(diǎn)來。 原文的翻譯實(shí)在無法理解。我這里做出自己收集到的實(shí)現(xiàn)。 opencv中提供了floodfill的例子,應(yīng)該說功能強(qiáng)大 對于本例,問題在于如何自動化這個(gè)過程? 我實(shí)現(xiàn)了一個(gè)效果,主要是通過反過來找中間的黑點(diǎn),然后相加。這里屬于反過來使用floodfill,效果還是不錯(cuò)的. NICE!體現(xiàn)形態(tài)學(xué)的強(qiáng)大能力。如果你用輪廓來找的話,會很麻煩,而且不穩(wěn)定。但是用形態(tài)學(xué),確非常穩(wěn)定,只有在很特殊的情況下,才可能出現(xiàn)失敗的青年高考。 三、聯(lián)通分量提取 從二值圖像中提取聯(lián)通分量是許多自動圖形啊分析應(yīng)用的核心。除了在對應(yīng)A中每個(gè)連通分量中的一個(gè)點(diǎn)的已指的每一個(gè)位置我們置為1,其他為0 對于8連通,目前采用的算法是find contours。雖然有一些文檔中也提出了一些算法,但是根據(jù)我目前的知識結(jié)構(gòu),還是直接contour的方法最好。 ? 四、【關(guān)于細(xì)化和骨廓,屆時(shí)看不懂】 五、頂帽變換和底帽變換 頂帽變換的一個(gè)作用是去除光照不均勻 用于連鑄的效果非常明顯,我相信這樣可以把代碼質(zhì)量進(jìn)一步提高 黑帽 去除背景還是要這樣來做 從這點(diǎn)可以看出,它的確是效果要更好一點(diǎn)的。 小結(jié): 形態(tài)學(xué)變換應(yīng)該說是很強(qiáng)的,因?yàn)樗咏谠嫉那闆r,是不同于輪廓分析的基礎(chǔ)工具。在我之前的過程中確實(shí)缺乏這方面的使用,這方面的書還要多讀多用。 P.S. 在OPENCV中,提供了一攬子的解決方法 int?main() { ????Mat?src?=?imread("./image/chars_identify.jpg",0); ????? ????Mat?srcClone?=?src.clone(); ????Mat?element?=?getStructuringElement(MORPH_ELLIPSE,Size(7,3)); ????morphologyEx(src,srcClone,CV_MOP_TOPHAT,element); ????imshow("src",src); ????imshow("srcClone",srcClone); ????waitKey(); } 分為兩個(gè)部分,首先生成一個(gè)element,然后根據(jù)參數(shù)的不同,進(jìn)行形態(tài)學(xué)變換 /*?Morphological?operations?*/ enum { ????CV_MOP_ERODE????????=0, ????CV_MOP_DILATE???????=1, ????CV_MOP_OPEN?????????=2, ????CV_MOP_CLOSE????????=3, ????CV_MOP_GRADIENT?????=4, ????CV_MOP_TOPHAT???????=5, ????CV_MOP_BLACKHAT?????=6 };
void?creatCode()
{
????Mat?edge;
????Mat?code?=?imread("abcd123.bmp",0);
????threshold(code,code,0,255,THRESH_OTSU);
????threshold(code,code,0,255,THRESH_BINARY_INV);
????dilate(code,code,Mat(1,5,CV_8U));
????erode(code,edge,Mat());
????edge?=?code?-?edge;
????imshow("驗(yàn)證碼生成",code);
}
//-------------------邊界提取----------------//
void?getEdge(Mat?src)
{
????Mat?edge?;
????erode(src,edge,Mat());
????edge?=?src?-?edge;
????imshow("邊界提取",edge);
} 二、孔洞填充(注意,floodfill是沒有教程的) 一個(gè)孔洞可以被定義為由前景像素相連接的邊界所包圍的一個(gè)背景區(qū)域。關(guān)鍵是標(biāo)注出區(qū)域中的點(diǎn)來。 原文的翻譯實(shí)在無法理解。我這里做出自己收集到的實(shí)現(xiàn)。 opencv中提供了floodfill的例子,應(yīng)該說功能強(qiáng)大 對于本例,問題在于如何自動化這個(gè)過程? 我實(shí)現(xiàn)了一個(gè)效果,主要是通過反過來找中間的黑點(diǎn),然后相加。這里屬于反過來使用floodfill,效果還是不錯(cuò)的. NICE!體現(xiàn)形態(tài)學(xué)的強(qiáng)大能力。如果你用輪廓來找的話,會很麻煩,而且不穩(wěn)定。但是用形態(tài)學(xué),確非常穩(wěn)定,只有在很特殊的情況下,才可能出現(xiàn)失敗的青年高考。 三、聯(lián)通分量提取 從二值圖像中提取聯(lián)通分量是許多自動圖形啊分析應(yīng)用的核心。除了在對應(yīng)A中每個(gè)連通分量中的一個(gè)點(diǎn)的已指的每一個(gè)位置我們置為1,其他為0 對于8連通,目前采用的算法是find contours。雖然有一些文檔中也提出了一些算法,但是根據(jù)我目前的知識結(jié)構(gòu),還是直接contour的方法最好。 ? 四、【關(guān)于細(xì)化和骨廓,屆時(shí)看不懂】 五、頂帽變換和底帽變換 頂帽變換的一個(gè)作用是去除光照不均勻 用于連鑄的效果非常明顯,我相信這樣可以把代碼質(zhì)量進(jìn)一步提高 黑帽 去除背景還是要這樣來做 從這點(diǎn)可以看出,它的確是效果要更好一點(diǎn)的。 小結(jié): 形態(tài)學(xué)變換應(yīng)該說是很強(qiáng)的,因?yàn)樗咏谠嫉那闆r,是不同于輪廓分析的基礎(chǔ)工具。在我之前的過程中確實(shí)缺乏這方面的使用,這方面的書還要多讀多用。 P.S. 在OPENCV中,提供了一攬子的解決方法 int?main() { ????Mat?src?=?imread("./image/chars_identify.jpg",0); ????? ????Mat?srcClone?=?src.clone(); ????Mat?element?=?getStructuringElement(MORPH_ELLIPSE,Size(7,3)); ????morphologyEx(src,srcClone,CV_MOP_TOPHAT,element); ????imshow("src",src); ????imshow("srcClone",srcClone); ????waitKey(); } 分為兩個(gè)部分,首先生成一個(gè)element,然后根據(jù)參數(shù)的不同,進(jìn)行形態(tài)學(xué)變換 /*?Morphological?operations?*/ enum { ????CV_MOP_ERODE????????=0, ????CV_MOP_DILATE???????=1, ????CV_MOP_OPEN?????????=2, ????CV_MOP_CLOSE????????=3, ????CV_MOP_GRADIENT?????=4, ????CV_MOP_TOPHAT???????=5, ????CV_MOP_BLACKHAT?????=6 };
總結(jié)
- 上一篇: linux文件分割(将大的日志文件分割成
- 下一篇: 网络软件的组成