生活随笔
收集整理的這篇文章主要介紹了
                                
OpenCV—形态学运算定义与实现
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.                        
 
                                
                            
                            
                            OpenCV—形態(tài)學(xué)運(yùn)算定義與實(shí)現(xiàn)
1.形態(tài)學(xué)運(yùn)算與結(jié)構(gòu)元素
形態(tài)學(xué)運(yùn)算是針對(duì)二值圖像依據(jù)數(shù)學(xué)形態(tài)學(xué)(Mathematical Morphology)的集合論方法發(fā)展起來(lái)的圖像處理方法。數(shù)學(xué)形態(tài)學(xué)起源于巖相學(xué)對(duì)巖石結(jié)構(gòu)的定量描述工作,近年來(lái)在數(shù)字圖像處理和機(jī)器視覺(jué)領(lǐng)域中得到了廣泛的應(yīng)用,形成了一種獨(dú)特的數(shù)字圖像分析方法和理論。
結(jié)構(gòu)元素可以簡(jiǎn)單的定義為像素的組合,在對(duì)應(yīng)的像素上定義了原點(diǎn)(也稱(chēng)錨點(diǎn))。形態(tài)學(xué)濾波器的應(yīng)用過(guò)程就是利用這個(gè)結(jié)構(gòu)元素探測(cè)圖像中每個(gè)像素的操作過(guò)程。把某個(gè)像素設(shè)為結(jié)構(gòu)元素的錨點(diǎn)后,結(jié)構(gòu)元素和圖像重疊部分的像素集合就是特定形態(tài)學(xué)運(yùn)算的應(yīng)用對(duì)象。結(jié)構(gòu)元素原則上可以是任何形狀,但通常是一個(gè)簡(jiǎn)單形狀,如正方形、圓形、菱形等,且把中心點(diǎn)作為原點(diǎn)。
2.腐蝕與膨脹運(yùn)算
(1)腐蝕 erode
腐蝕的定義
也就是說(shuō),由B對(duì)X腐蝕所產(chǎn)生的二值圖像E是滿(mǎn)足以下條件的點(diǎn)(x,y)的集合:如果B的原點(diǎn)平移到點(diǎn)(x,y),那么B將完全包含于X中。
另一種理解,腐蝕就是把當(dāng)前像素替換成所定義的像素集中的最小像素值。由于輸入的二值圖像只包含黑色(0)和白色(255)像素,因此如果結(jié)構(gòu)元素覆蓋的圖像區(qū)域中有黑色像素,則錨點(diǎn)所在像素(x,y)將會(huì)被替換成黑色0,否則替換成白色255。而物體的邊界通常會(huì)有黑色像素,所以腐蝕相當(dāng)于收縮邊界。
腐蝕的作用
腐蝕是一種消除邊界點(diǎn),使邊界向內(nèi)部收縮的過(guò)程。可以用來(lái)消除小且無(wú)意義的物體。
[cpp]?view plaincopy
??????cv::Mat?image=?cv::imread("binary.bmp");??????if?(!image.data)??????????return?0;?????????cv::namedWindow("Image");??????cv::imshow("Image",image);????????cv::Mat?eroded;??????cv::erode(image,eroded,cv::Mat());????????cv::namedWindow("Eroded?Image");??????cv::imshow("Eroded?Image",eroded);????????cv::Mat?element(7,7,CV_8U,cv::Scalar(1));?????????cv::erode(image,eroded,element);??????cv::namedWindow("Eroded?Image?(7x7)");??????cv::imshow("Eroded?Image?(7x7)",eroded);????????cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);????????cv::namedWindow("Eroded?Image?(3?times)");??????cv::imshow("Eroded?Image?(3?times)",eroded);??????cv::waitKey(0);??原始二值圖像
3×3正方形結(jié)構(gòu)元素腐蝕結(jié)果
7×7正方形結(jié)構(gòu)元素腐蝕結(jié)果
3×3正方形結(jié)構(gòu)元素腐蝕3次結(jié)果
(2)膨脹 dilate
膨脹的定義
由B對(duì)X膨脹所產(chǎn)生的二值圖像D是滿(mǎn)足以下條件的點(diǎn)(x,y)的集合:如果B的原點(diǎn)平移到點(diǎn)(x,y),那么它與X的交集非空。
另一種理解為:膨脹是腐蝕的反運(yùn)算,它把當(dāng)前像素(原點(diǎn)所在位置(x,y))替換成所定義的像素集中的最大像素值。由于輸入的二值圖像只包含黑色(0)和白色(255)像素,因此當(dāng)結(jié)構(gòu)元素覆蓋的圖像中有白色(物體),則該結(jié)構(gòu)元素原點(diǎn)所在位置(x,y)的值將會(huì)被替換成白色255。
膨脹的作用
也就是說(shuō),膨脹是將與物體接觸的所有背景點(diǎn)合并到該物體中,使邊界向外部擴(kuò)張的過(guò)程??梢杂脕?lái)填補(bǔ)物體中的空洞。
[cpp]?view plaincopy
??????cv::Mat?dilated;??????cv::dilate(image,dilated,cv::Mat());????????cv::namedWindow("Dilated?Image");??????cv::imshow("Dilated?Image",dilated);??
3×3正方形結(jié)構(gòu)元素膨脹結(jié)果
(3)自定義結(jié)構(gòu)元素
除了使用常規(guī)的規(guī)則結(jié)構(gòu)元素,我們也可以自定義結(jié)構(gòu)元素。下面使用Mat類(lèi)型的構(gòu)造函數(shù)創(chuàng)建一個(gè)3×3十字型的結(jié)構(gòu)元素。
[cpp]?view plaincopy
??unsigned?char?m[9]?=?{??????????0,1,0,??????????1,1,1,??????????0,1,0?????????};??cv::Mat?element1(3,3,CV_8U,m);?????int?nr?=?element1.rows;??int?nl?=?element1.cols;??for(int?j?=?0;j<nr;j++)??{??????char?*data?=?element1.ptr<char>(j);??????for(int?i?=?0;?i<nl;?i++)??????{??????????int?value?=?data[i];??????????cout<<value<<"?";??}??????cout<<endl;??}?????????cv::erode(image,eroded,element1);??????cv::namedWindow("Eroded?Image?(user?define)");??????cv::imshow("Eroded?Image?(user?define)",eroded);??
自定義結(jié)構(gòu)元素腐蝕結(jié)果
使用Mat_模板類(lèi)自定義5×5大小十字形、菱形、方形、x形結(jié)構(gòu)元素:
[cpp]?view plaincopy
????cv::Mat_<uchar>?cross(5,5);??????cv::Mat_<uchar>?diamond(5,5);??????cv::Mat_<uchar>?x(5,5);??????cv::Mat_<uchar>?square(5,5);???????????????cross?<<????????????0,?0,?1,?0,?0,????????????0,?0,?1,?0,?0,????????????1,?1,?1,?1,?1,????????????0,?0,?1,?0,?0,????????????0,?0,?1,?0,?0;??????????????????????????diamond?<<????????????0,?0,?1,?0,?0,????????????0,?1,?1,?1,?0,????????????1,?1,?1,?1,?1,????????????0,?1,?1,?1,?0,????????????0,?0,?1,?0,?0;????????????????????????????x?<<????????????1,?0,?0,?0,?1,????????????0,?1,?0,?1,?0,????????????0,?0,?1,?0,?0,????????????0,?1,?0,?1,?0,????????????1,?0,?0,?0,?1;??????????????????square?<<????????????1,?1,?1,?1,?1,????????????1,?1,?1,?1,?1,????????????1,?1,?1,?1,?1,????????????1,?1,?1,?1,?1,????????????1,?1,?1,?1,?1;??<span?style="white-space:pre">????</span>????????cout<<endl<<"x-shaped?structuring?element"<<endl<<endl;???????int?xnr?=?x.rows;???????int?xnl?=?x.cols;???????for(int?j?=?0;j<nr;j++)???????{??????????char?*data?=?x.ptr<char>(j);??????????for(int?i?=?0;?i<nl;?i++)??????????{??????????????int?value?=?data[i];??????????????cout<<value<<"?";??????????}??????????cout<<endl;???????}??
3.開(kāi)閉運(yùn)算
(1)閉運(yùn)算
閉運(yùn)算定義??先膨脹后腐蝕
閉運(yùn)算作用
閉運(yùn)算用來(lái)填充物體內(nèi)細(xì)小空洞、連接鄰近物體、平滑其邊界的同時(shí)并不明顯改變其面積?;旧纤行〉讲荒芡暾菁{結(jié)構(gòu)元素的空隙或間隙,都會(huì)被閉運(yùn)算消除(即連起來(lái))。
[cpp]?view plaincopy
cv::Mat?element5(5,5,CV_8U,cv::Scalar(1));??cv::Mat?closed;??cv::morphologyEx(image,?closed,cv::MORPH_CLOSE,element5);????cv::namedWindow("Closed?Image");??cv::imshow("Closed?Image",closed);??cv::waitKey(0);??5×5正方形結(jié)構(gòu)元素閉運(yùn)算結(jié)果
(2)開(kāi)運(yùn)算
開(kāi)運(yùn)算定義??先腐蝕后膨脹
開(kāi)運(yùn)算作用
用來(lái)背景中的消除小物體、在纖細(xì)點(diǎn)處分離物體、平滑較大物體的邊界的同時(shí)并不明顯改變其面積。所有小到不能容納結(jié)構(gòu)元素的物體都會(huì)被移除。
[cpp]?view plaincopy
cv::Mat?element5(5,5,CV_8U,cv::Scalar(1));??cv::Mat?opened;??cv::morphologyEx(image,?opened,cv::MORPH_OPEN,element5);????cv::namedWindow("Opened?Image");??cv::imshow("Opened?Image",opened);??cv::waitKey(0);??5×5正方形結(jié)構(gòu)元素開(kāi)運(yùn)算結(jié)果
形態(tài)學(xué)還有很多其他運(yùn)算,例如top-hat等,等空了再補(bǔ)充。
轉(zhuǎn)載請(qǐng)注明:iracer的CSDN博客?http://blog.csdn.net/iracer/article/details/49057145
                            
總結(jié)
                            
                                以上是生活随笔為你收集整理的OpenCV—形态学运算定义与实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                            
                                如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。