日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv学习(二十四)之腐蚀与膨胀

發布時間:2024/8/1 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv学习(二十四)之腐蚀与膨胀 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

腐蝕和膨脹是對二維圖片的進行操作的形態學運算,簡單來講形態學操作就是基于形狀的一系列圖像處理操作,通過將結構元素作用于輸入圖像來產生輸出圖像。腐蝕(Erosion)和膨脹(Dilation)是最基本的形態學操作,他們運用廣泛主要有:
. 消除噪聲
. 分割(ioslate)獨立的圖像元素以及連接(join)相鄰的元素
. 尋找圖像中的明顯的極大值區域或極小值區域
. 求出圖像的梯度
給出圖片如下:

圖片背景為白色,字母為黑色。下面將根據此圖形對膨脹腐蝕的原理進行說明。
1.膨脹
膨脹(dilate)就是求局部最大值的操作,從數學的角度來講膨脹或者腐蝕就是將一幅二維圖像或圖像的一部分(稱之為A)與一個模板也就是核(稱為B)進行卷集運算的過程。
核可以是任何形狀和大小,與之前介紹的模板一樣,核有一個可定義的錨點。
. 膨脹操作是將圖像A與任意形狀的內核B(通常為正方形或者圓形)進行卷集
. 內核B中可定義的錨點通稱定義為內核中心點
. 進行膨脹操作時,將內核B在圖像A上進行滑動操作,將內核B覆蓋的區域的最大像素值提取并提到內核B錨點位置的像素。
. 上述操作將會導致圖像中的亮區開始擴展,因為白色的像素值要遠遠大于黑色的像素值。經膨脹運算后其圖形如下

對于膨脹運算其數學表達式如下:

opencv提供了dilate函數來實現膨脹操作,其原型如下

C++: void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() )

參數解釋如下:
. InputArray src: 輸入圖像,可以是Mat類型,對于圖像通道數量沒有要求,但是圖像深度應為CV_8U、CV_16U、CV_16s、CV_32F或CV_64F其中之一。
. OutputArray dst: 輸出圖像,與原圖像有相同的尺寸和類型。
. InpurArray kernel: 用于膨脹操作的kernel,當參數=Mat()即NULL時,kernel是一個錨點位于中心的3x3模板。可以通過getStructuringElement函數來制定kernel的形狀和尺寸,其函數原型如下:

Mat cv::getStructuringElement ( int shape,Size ksize,Point anchor = Point(-1,-1) )

參數解釋:
. int shape: kernel的形狀,由cv::MorphShapes指定,如下

分別是矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、橢圓形(MORPH_ELLIPSE)
. Size ksize: kernel的尺寸
. Point anchor = Point(-1, -1): 錨點位置

一般在調用erode以及dilate函數之前需要定義一個Mat類型的變量來獲得getStructuringElement()函數的返回值,對于錨點如果沒有特殊要求使用默認值即可

. Point anchor = Point(-1, -1): 錨點位置
. int iterations=1: 迭代使用膨脹的次數
. int borderType = BORDER_CONSTANT: 用于推斷圖像外部像素的某種邊界模式,其有默認值BORDER_CONSTANT,可以通過cv::BorderTypes查詢其他的方法。
. const Scalar & borderValue = morphologyDefaultBorderValue() : 邊界為常數時的邊界值,有默認值morphologyDefaultBorderValue(),一般不用進行設置,如果有特殊需要,可以查看 createMorphologyFilter()函數得到詳細信息。

2.腐蝕
. 腐蝕在形態學操作家族里是膨脹操作的孿生姐妹,它是提取內核覆蓋下的像素最小值
. 進行腐蝕操作時,將內核窗口在圖像A上進行滑動,將內核B覆蓋的區域最小像素值提取并代替錨點位置的像素值
. 腐蝕操作將會導致圖像中像素值較低的元素進行擴展,造成黑色部分加粗,如下圖所示:

腐蝕操作的數學表達式如下:

opencv提供erode來實現腐蝕操作,其原型如下:

void cv::erode ( InputArray src,OutputArray dst,InputArray kernel,Point anchor = Point(-1,-1),int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar & borderValue = morphologyDefaultBorderValue() )

參數解釋:
. InputArray src: 輸入圖像可以是Mat類型,可以是任意通道圖像,圖像深度只能是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F其中的一個。
. OutputArray dst: 輸出圖像,與輸入圖像尺寸類型一致。
. Input Array kernel: 用于腐蝕操作的kernel,當參數=Mat()即NULL時,kernel是一個錨點位于中心的3x3模板。可以通過getStructuringElement函數來制定kernel的形狀和尺寸,具體用法請參考對膨脹的表述
. Point anchor = Point(-1, -1): 錨點位置
. int iterations = 1: 迭代腐蝕操作次數,有默認值1
. int borderType = BORDER_CONSTANT: 用于推斷圖像外部像素的某種邊界模式,其有默認值BORDER_CONSTANT,可以通過cv::BorderTypes查詢其他的方法。
. const Scalar & borderValue = morphologyDefaultBorderValue(): 邊界為常數時的邊界值,有默認值morphologyDefaultBorderValue(),一般不用進行設置,如果有特殊需要,可以查看 createMorphologyFilter()函數得到詳細信息。

示例程序:

#include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp>using namespace std; using namespace cv;//定義全局變量 Mat g_srcImage; Mat g_dilateImage; Mat g_erodeImage;//定義兩個軌跡條屬性 const int typeMaxValue = 2; //膨脹腐蝕采用圖形的類型 const int kernelSizeMaxVale = 21; //采用kernel的尺寸最大值int dilateTypeValue = 0; //默認膨脹操作模板圖像類型 int dilateSizeValue = 5; //默認模板圖像尺寸 int erodeTypeValue = 0; int erodeSizeValue = 5;//定義兩個回調函數 void dilateFun(int, void*); //膨脹回調函數 void erodeFun(int, void*); //腐蝕回調函數int main() {g_srcImage = imread("cat.jpg");//判斷圖像是否打開成功if(g_srcImage.empty()){cout << "圖像加載失敗!" << endl;return -1;}elsecout << "圖像加載成功!" << endl << endl;namedWindow("原圖像", WINDOW_AUTOSIZE);imshow("原圖像",g_srcImage);//定義膨脹操作窗口屬性及軌跡條性質namedWindow("圖像膨脹", WINDOW_AUTOSIZE);namedWindow("圖像腐蝕", WINDOW_AUTOSIZE);char typeName[20];sprintf(typeName, "模板類型 %d", typeMaxValue);char sizeName[20];sprintf(sizeName, "模板尺寸 %d", kernelSizeMaxVale);//創建膨脹軌跡條createTrackbar(typeName, "圖像膨脹", &dilateTypeValue, typeMaxValue, dilateFun);createTrackbar(sizeName, "圖像膨脹", &dilateSizeValue, kernelSizeMaxVale, dilateFun);dilateFun(dilateTypeValue, 0);dilateFun(dilateSizeValue, 0);//創建腐蝕軌跡條createTrackbar(typeName, "圖像腐蝕", &erodeTypeValue, typeMaxValue, erodeFun);createTrackbar(sizeName, "圖像腐蝕", &erodeSizeValue, kernelSizeMaxVale, erodeFun);erodeFun(erodeTypeValue, 0);erodeFun(erodeSizeValue, 0);waitKey(0);return 0; }//膨脹回調函數 void dilateFun(int, void*) {//確定模板圖像類型int dilate_type;if(dilateTypeValue == 0)dilate_type = MORPH_RECT;else if (dilateTypeValue == 1)dilate_type = MORPH_CROSS;elsedilate_type = MORPH_ELLIPSE;Mat element = getStructuringElement(dilate_type, Size(2*dilateSizeValue + 1, 2*dilateSizeValue + 1));dilate(g_srcImage, g_dilateImage, element); //膨脹操作imshow("圖像膨脹", g_dilateImage);}//腐蝕回調函數 void erodeFun(int, void*) {//確定模板圖像類型int erode_type;if(erodeTypeValue == 0)erode_type = MORPH_RECT;else if (erodeTypeValue == 1)erode_type = MORPH_CROSS;elseerode_type = MORPH_ELLIPSE;Mat element = getStructuringElement(erode_type, Size(2*erodeSizeValue + 1, 2*erodeSizeValue + 1));erode(g_srcImage, g_erodeImage, element); //腐蝕操作imshow("圖像腐蝕", g_erodeImage); }

運行結果如下:

總結

以上是生活随笔為你收集整理的opencv学习(二十四)之腐蚀与膨胀的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。