OPenCV膨胀函数dilate()的使用
OPenCV版本:4.4
IDE:VS2017
功能描述
簡述:使用一個指定的核元素去膨脹一個圖像,圖像膨脹的過程類似于一個卷積的過程,源圖像矩陣A以及結構元素B,B在A矩陣上依次移動,每個位置上B所覆蓋元素的最大值替換B的中心位置值(即錨點處),完成整個膨脹的過程。
注意:所謂的腐蝕與膨脹的對象是針對圖像中的白色元素所說的。看成是圖像中的物體話會理解反。
算法通俗理解:膨脹算法使圖像擴大一圈,給圖像中的對象邊界添加像素,其運算過程就是用3X3的結構元素,掃描二值圖像的每一個像素,用結構元素與其覆蓋的二值圖像做“與”運算,如果都為0,結構圖像的該像素為0,否則為1。結果就是使二值圖像擴大一圈。
函數使用一個指定的核元素去膨脹源圖像,內核有一個可定義的 錨點,我們叫他內核中心點,膨脹操作時,獲取內核覆蓋區域最大像素值,并代替錨點的像素,最大值通過以下公式獲取:
dst(x,y)=max?(x′,y′):element(x′,y′)≠0src(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)=(x′,y′):element(x′,y′)?=0max?src(x+x′,y+y′)
函數支持就地模式,膨脹操作可以迭加使用多次,在多通道圖像的情況下,每個通道獨立處理。
函數原型:
CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1,-1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() );參數描述
-
參數 src 輸入圖像;通道的數量可以是任意的,但是深度值應該是以下之一:
CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. -
參數 dst 和源圖像同樣大小和類型的輸出圖像。
-
參數 kernel 膨脹核元素,如果elemenat=Mat(), 是一個3 x 3的矩形核元素,核可以使用getStructuringElement來創建。
-
參數 anchor 元素中的錨點的位置,默認是值(-1,-1),也就是說錨點在元素的中心位置。
-
參數 iterations 膨脹的迭代次數。
-
參數 borderType 像素外推方法。參見#BorderTypes, BORDER_WRAP不支持。
-
參數 borderValue 固定邊緣的情況下的邊緣值。
參考: erode, morphologyEx, getStructuringElement
源碼示例:
#include <iostream> #include <opencv2/opencv.hpp>int main() {cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png");if (image.empty()){std::cout << "image read failed!" << std::endl;cv::waitKey(0);return 0;}cv::Mat imageDst;//自定義核cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(8, 8));cv::imshow("原圖", image);cv::dilate(image, imageDst, element);cv::imshow("膨脹", imageDst);cv::waitKey(0); }運行結果:
背景(白色)膨脹,而果汁杯子的圖像及水果的圖像縮小了。
總結
以上是生活随笔為你收集整理的OPenCV膨胀函数dilate()的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV计算图像的平均值和标准差的函
- 下一篇: OpenCV图像腐蚀函数erode()的