膨脹、腐蝕屬於形態學的操作, 簡單來說就是基於形狀的一系列圖像處理操作。
膨脹腐蝕是基於高亮部分(白色)操作的, 膨脹是対高亮部分進行膨脹, 類似“領域擴張”, 腐蝕是高亮部分被腐蝕, 類似“領域被蠶食”。
膨脹腐蝕的應用和功能: (1)、消除噪聲(2)、分割獨立元素或連接相鄰元素(3)、尋找圖像中的明顯極大值、極小值區域(4)、求圖像的梯度。
其他相關: 開運算、閉運算;頂帽、黒帽;形態學梯度 ;
一、膨脹操作
膨脹就是求局部最大值的操作, 從數學角度上來講, 膨脹或腐蝕就是將圖像(或區域)A與核B進行卷積。
核可以是任意大小和形狀, 它有一個獨立定義的參考點(錨點), 多數情況下, 核是一個小的中間帶參考點和實心正方形或者圓盤, 可以看做是一個模板或掩碼。
膨脹是求局部最大值的操作, 核B與圖形卷積, 即核B覆蓋的區域的像素點的最大值, 並把這個最大值複製給參考點指定的像素, 這樣就會使圖像中的高亮區域逐漸增長, 如下圖所示:
函數原型爲:
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: 輸入原圖像(建議爲二值圖)。
dst: 輸出圖像要求和src一樣的尺寸和類型。
kernel: 膨脹操作的核, 當爲NULL時, 表示使用參考點位於中心的3x3的核一般使用getStructuringElement獲得指定形狀和尺寸的結構元素(核)可選以下三種形狀: 矩形、交叉形、橢圓形。
anchor: 錨的位置, 默認值Point(-1,-1), 表示位於中心。
iterations: 膨脹的次數。
borderType: 邊界模式, 一般採用默認值。
borderValue: 邊界值, 一般採用默認值。
代碼如下:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
//#include "onMouse.h"
using namespace cv;
using namespace std;
int main()
{
Mat image=imread("/Users/zhangxiaoyu/Desktop/1.png",0);//0爲讀出的是灰度圖像
if(image.empty())
{
cout<<"Error!cannot be read...../n";
return -1;
}
//膨脹圖像
cv::Mat dilated;
cv::Mat element=getStructuringElement(MORPH_RECT, Size(7,7));
cv::dilate(image, dilated, element);
//顯示原始圖片
cv::namedWindow("original image");
cv::imshow("original image", image);
//顯示圖片
cv::namedWindow("dilated image");
cv::imshow("dilated image",dilated );
waitKey(0);
return 0;
}
原始圖像(灰度圖像)如下:
膨脹後的圖像爲:
腐蝕和膨脹相反, 是取局部最小值, 高亮區域逐漸減小, 如下圖所示:
函數原型爲:
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor=Point(-1,-1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() );
代碼如下://腐蝕圖像
cv::Mat eroded;
cv::Mat element=getStructuringElement(MORPH_RECT, Size(7,7));
erode(image, eroded, element);
運行程序,如下圖: