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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作

發(fā)布時間:2024/3/13 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

圖像形態(tài)學(xué)中兩種最基本的操作就是對圖形的腐蝕和膨脹,可以說,形態(tài)學(xué)中的中高級操作都是建立在這兩種操作之上。通過這兩種基本的運算可以去除圖像中的噪聲,分割出獨立的區(qū)域或者將兩個區(qū)域連接在一起。

關(guān)于圖像腐蝕和膨脹的概念,不嚴謹?shù)暮唵卫斫馐?#xff1a;經(jīng)過腐蝕和膨脹操作后最終的效果是對圖像中物體的邊界進行一層一層的腐蝕和膨脹操作,這個邊界包括內(nèi)邊界和外邊界。
嚴謹?shù)睦斫馐沁@樣的:圖像的腐蝕和膨脹實際上是用某種形狀的窗去遍歷圖像中的每一個元素,并用這個形狀中的最大值或最小值做為錨點的值(錨點的概念可參考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/124173092)。若取的是最大值,則是膨脹操作,若取的是最小值,則是腐蝕操作。這里某種形狀可以是十字形、菱形、矩形、X形等。這里我補充說明一下,其實所有的窗都是矩形的,那么怎樣定義不同的形狀呢?是這樣操作的:通過把矩形窗中的元素置為1形成不同的形狀。更詳細的說明可見本文下面對函數(shù)getStructuringElement()參數(shù)shape的介紹。

OpenCV提供了函數(shù)erode()和函數(shù)dilate()分別用于圖像形態(tài)學(xué)的腐蝕與膨脹操作,下面分別介紹。

函數(shù)dilate()的數(shù)學(xué)運算表達式如下:
dst ( x , y ) = min ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=min(x,y):element(x,y)?=0?src(x+x,y+y)
其中(x’,y’)是窗中的元素坐標。

函數(shù)erode()的數(shù)學(xué)運算表達式如下:
dst ( x , y ) = max ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=max(x,y):element(x,y)?=0?src(x+x,y+y)
其中(x’,y’)是窗中的元素坐標。

圖像形態(tài)學(xué)的腐蝕操作函數(shù)erode()的原型如下:

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

圖像形態(tài)學(xué)的腐蝕操作函數(shù)dilate()的原型如下:

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

可見,兩個函數(shù)的原型除了函數(shù)名不一樣,其它都是一樣的,所以我們就統(tǒng)一介紹兩個函數(shù)參數(shù)的意義。
參數(shù)意義如下:
src—輸入圖像,通道數(shù)任意,數(shù)據(jù)深度只能為 CV_8U, CV_16U, CV_16S, CV_32F,CV_64F中的一種。每個通道將被單獨處理。
ds—為輸出圖像,尺寸和數(shù)據(jù)類型與輸入圖像一致。
kernel—erode()使用某種形狀的窗侵蝕一個圖像,dilate()也使用某種形狀的窗對圖像進行膨脹。參數(shù)kernel就表示這個窗。顯然這個窗越大,顯然每次對圖像的腐蝕或膨脹越多,反之亦然。有下面兩種構(gòu)造這個窗的方法。有下面兩種構(gòu)造這個窗的方法。
?①使用函數(shù)getStructuringElement()來獲取,函數(shù)getStructuringElement()的原型如下:

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

?函數(shù)getStructuringElement()的參數(shù)意義如下:
?shape—窗的形狀,MORPH_RECT為矩形,矩形中的每一個元素的值為1;MORPH_CROSS代表十字形結(jié)構(gòu),十字形的長和寬由ksize定,十字形上的元素值也為1;MORPH_ELLIPSE為橢圓,橢圓中的每一個元素的值也為1,橢圓內(nèi)切于參數(shù)ksize定義的矩形大小。可以結(jié)合下面這個表更好理解。

?ksize—其意義見對參數(shù)shape的講解。
?anchor—當shape為十字形時,這個參數(shù)表示十字線的橫線和豎線的交點位置。
?②自定義kernel窗,此種方法的示例可以參見下面這篇博文:
?https://blog.csdn.net/wenhao_ir/article/details/51915869
繼續(xù)講函數(shù)erode()和函數(shù)dilate()的參數(shù)意義。
anchor—錨點位置。
iterations—表示迭代次數(shù),即對圖像做幾次腐蝕和膨脹。
borderType—邊界擴展處理方式,詳情見 https://blog.csdn.net/wenhao_ir/article/details/124177989
borderValue—關(guān)于這個值,也請參見 https://blog.csdn.net/wenhao_ir/article/details/124177989

下面上使用函數(shù)erode()和函數(shù)dilate()進行腐蝕和膨脹處理的示例代碼:
代碼中用到的圖像下載鏈接:https://pan.baidu.com/s/1Acoq3mR2RK0KHtYBCtq9qg?pwd=708g

//博主微信/QQ 2487872782 //有問題可以聯(lián)系博主交流 //有圖像處理需求也可聯(lián)系博主 //圖像處理技術(shù)交流QQ群 271891601//OpenCV版本:3.0 //VS版本:2013#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include<opencv2/imgcodecs/imgcodecs.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {//載入原圖 Mat image = imread("F:/material/images/P0046-erode_dilate-02.bmp",0);//顯示原圖 imshow("原圖的灰度圖", image);//獲取自定義核 Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));Mat out1, out2;//進行膨脹操作 dilate(image, out1, element);//進行腐蝕操作 erode(image, out2, element,cv::Point(-1,-1),2);//顯示效果圖 imshow("膨脹操作效果圖", out1);imshow("腐蝕操作效果圖", out2);waitKey(0);return 0; }

代碼運行結(jié)果如下圖所示:

上面的示例代碼是對圖像的腐蝕操作和膨脹操作的直觀認識,接下來,我們再通過Python示例代碼來從數(shù)據(jù)運算上看一看圖像的腐蝕操作和閉操作是怎么回事。
先來探究膨脹操作:
探究膨脹操作的示例代碼如下:

# 博主微信/QQ 2487872782 # 有問題可以聯(lián)系博主交流 # 有圖像處理需求也可聯(lián)系博主 # 圖像處理技術(shù)交流QQ群 271891601# !/usr/bin/env python # -*- coding: utf-8 -*- # OpenCV的版本為4.1import cv2 as cv import numpy as npA = np.zeros((9, 9), dtype='uint8')A[3:6, 3:6] = 5 A[4, 4] = 9structure1 = cv.getStructuringElement(cv.MORPH_RECT, (3, 3)) structure2 = cv.getStructuringElement(cv.MORPH_CROSS, (3, 3))dilate_out1 = cv.dilate(A, structure1) dilate_out2 = cv.dilate(A, structure2)

運行結(jié)果如下圖所示:





從以上運行結(jié)果可以看出,膨脹操作的運算規(guī)則的確是我上面介紹的那樣。為了避免大家來回滾動頁面,我再將運算規(guī)則摘錄如下:
圖像的腐蝕和膨脹實際上是用某種形狀的窗去遍歷圖像中的每一個元素,并用這個形狀中的最大值或最小值做為錨點的值(錨點的概念可參考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/124173092)。若取的是最大值,則是膨脹操作,若取的是最小值,則是腐蝕操作。這里某種形狀可以是十字形、菱形、矩形、X形等。這里我補充說明一下,其實所有的窗都是矩形的,那么怎樣定義不同的形狀呢?是這樣操作的:通過把矩形窗中的元素置為1形成不同的形狀。更詳細的說明可見本文對函數(shù)getStructuringElement()參數(shù)shape的介紹。
函數(shù)dilate()的數(shù)學(xué)運算表達式如下:
dst ( x , y ) = min ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=min(x,y):element(x,y)?=0?src(x+x,y+y)
其中(x’,y’)是窗中的元素坐標。

再來探究腐蝕操作。
探究腐蝕操作的示例代碼如下:

運行結(jié)果如下:






從以上運行結(jié)果可以看出,腐蝕操作的運算規(guī)則的確是我上面介紹的那樣。為了避免大家來回滾動頁面,我再將運算規(guī)則摘錄如下:
圖像的腐蝕和膨脹實際上是用某種形狀的窗去遍歷圖像中的每一個元素,并用這個形狀中的最大值或最小值做為錨點的值(錨點的概念可參考我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/124173092)。若取的是最大值,則是膨脹操作,若取的是最小值,則是腐蝕操作。這里某種形狀可以是十字形、菱形、矩形、X形等。這里我補充說明一下,其實所有的窗都是矩形的,那么怎樣定義不同的形狀呢?是這樣操作的:通過把矩形窗中的元素置為1形成不同的形狀。更詳細的說明可見本文對函數(shù)getStructuringElement()參數(shù)shape的介紹。
函數(shù)erode()的數(shù)學(xué)運算表達式如下:
dst ( x , y ) = max ? ( x ′ , y ′ ) : element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=max(x,y):element(x,y)?=0?src(x+x,y+y)
其中(x’,y’)是窗中的元素坐標。

知道了腐蝕和膨脹的具體運算過程后,我們便可以知道當參數(shù)shape取不同形狀時,效果有什么區(qū)別。具體效果有什么不同,大家在理解以上運算過程后,便可以在腦海中想像了,這里博主就不再碼字了。

擴展閱讀:
圖像的形態(tài)學(xué)開操作(開運算)和閉操作(閉運算)的概念和作用,并用OpenCV的函數(shù)morphologyEx()實現(xiàn)對圖像的開閉操作
圖像的形態(tài)學(xué)梯度運算(基本梯度、外部梯度、內(nèi)部梯度、X方向梯度、Y方向梯度)的概念、作用以及相關(guān)的OpenCV示例代碼
圖像形態(tài)學(xué)操作之頂帽操作(TopHat)與黑帽操作(BlackHat)
詳解圖像形態(tài)學(xué)中的擊中擊不中變換操作(HMT),并提醒大家OpenCV4中的擊中擊不中變換操作是有問題的

總結(jié)

以上是生活随笔為你收集整理的详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。