生活随笔
收集整理的這篇文章主要介紹了
OpenCV—形态学运算定义与实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV—形態學運算定義與實現
1.形態學運算與結構元素
形態學運算是針對二值圖像依據數學形態學(Mathematical Morphology)的集合論方法發展起來的圖像處理方法。數學形態學起源于巖相學對巖石結構的定量描述工作,近年來在數字圖像處理和機器視覺領域中得到了廣泛的應用,形成了一種獨特的數字圖像分析方法和理論。
結構元素可以簡單的定義為像素的組合,在對應的像素上定義了原點(也稱錨點)。形態學濾波器的應用過程就是利用這個結構元素探測圖像中每個像素的操作過程。把某個像素設為結構元素的錨點后,結構元素和圖像重疊部分的像素集合就是特定形態學運算的應用對象。結構元素原則上可以是任何形狀,但通常是一個簡單形狀,如正方形、圓形、菱形等,且把中心點作為原點。
2.腐蝕與膨脹運算
(1)腐蝕 erode
腐蝕的定義
也就是說,由B對X腐蝕所產生的二值圖像E是滿足以下條件的點(x,y)的集合:如果B的原點平移到點(x,y),那么B將完全包含于X中。
另一種理解,腐蝕就是把當前像素替換成所定義的像素集中的最小像素值。由于輸入的二值圖像只包含黑色(0)和白色(255)像素,因此如果結構元素覆蓋的圖像區域中有黑色像素,則錨點所在像素(x,y)將會被替換成黑色0,否則替換成白色255。而物體的邊界通常會有黑色像素,所以腐蝕相當于收縮邊界。
腐蝕的作用
腐蝕是一種消除邊界點,使邊界向內部收縮的過程。可以用來消除小且無意義的物體。
[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正方形結構元素腐蝕結果
7×7正方形結構元素腐蝕結果
3×3正方形結構元素腐蝕3次結果
(2)膨脹 dilate
膨脹的定義
由B對X膨脹所產生的二值圖像D是滿足以下條件的點(x,y)的集合:如果B的原點平移到點(x,y),那么它與X的交集非空。
另一種理解為:膨脹是腐蝕的反運算,它把當前像素(原點所在位置(x,y))替換成所定義的像素集中的最大像素值。由于輸入的二值圖像只包含黑色(0)和白色(255)像素,因此當結構元素覆蓋的圖像中有白色(物體),則該結構元素原點所在位置(x,y)的值將會被替換成白色255。
膨脹的作用
也就是說,膨脹是將與物體接觸的所有背景點合并到該物體中,使邊界向外部擴張的過程。可以用來填補物體中的空洞。
[cpp]?view plaincopy
??????cv::Mat?dilated;??????cv::dilate(image,dilated,cv::Mat());????????cv::namedWindow("Dilated?Image");??????cv::imshow("Dilated?Image",dilated);??
3×3正方形結構元素膨脹結果
(3)自定義結構元素
除了使用常規的規則結構元素,我們也可以自定義結構元素。下面使用Mat類型的構造函數創建一個3×3十字型的結構元素。
[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);??
自定義結構元素腐蝕結果
使用Mat_模板類自定義5×5大小十字形、菱形、方形、x形結構元素:
[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.開閉運算
(1)閉運算
閉運算定義??先膨脹后腐蝕
閉運算作用
閉運算用來填充物體內細小空洞、連接鄰近物體、平滑其邊界的同時并不明顯改變其面積。基本上所有小到不能完整容納結構元素的空隙或間隙,都會被閉運算消除(即連起來)。
[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正方形結構元素閉運算結果
(2)開運算
開運算定義??先腐蝕后膨脹
開運算作用
用來背景中的消除小物體、在纖細點處分離物體、平滑較大物體的邊界的同時并不明顯改變其面積。所有小到不能容納結構元素的物體都會被移除。
[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正方形結構元素開運算結果
形態學還有很多其他運算,例如top-hat等,等空了再補充。
轉載請注明:iracer的CSDN博客?http://blog.csdn.net/iracer/article/details/49057145
總結
以上是生活随笔為你收集整理的OpenCV—形态学运算定义与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。