1.認識形態學梯度
對二值圖像進行這一操作,可將圖塊的邊緣突出出來,故可用來保留物體邊緣輪廓。
1.1處理過程
將膨脹後的原圖像和腐蝕後的原圖像做差,可以得到形態學梯度。
1.2優點
可以突出高亮區域的外圍,因為它是區域的膨脹減去區域的收縮。
2.OpenCV函數
<code>void morphologyEx(InputArray src,
OutputArray dst,
int op,
InputArray kernel,
Point anchor = Point(-1, -1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morpologyDefaultBorderValue());/<code>
參數如下:
- src:輸入圖像,即原圖像,填 Mat 類的對象即可。
- dst:目標圖像,需要和原圖片有一樣的尺寸和類型。
- op:形態學運算的類型。
- kernel:膨脹操作的核。當為 NULL 時,表示的是使用參考點位於中心,大小 3×3 的核。
- anchor:錨點的位置,默認位於中心。
- iterations :迭代使用 dilate() 的次數,默認值為 1。
- borderType:邊界拓展的方法。
- borderValue:當邊界為常數時的邊界值,有默認值,一般不用管。
3.C++實現
<code>//--------------------------------------【程序說明】-------------------------------------------
//\t\t程序描述:用morphologyEx進行形態學梯度運算
//\t\t開發測試所用操作系統: Windows 10 64bit
//\t\t開發測試所用IDE版本:Visual Studio 2017
//\t\t開發測試所用OpenCV版本:\t3.4
//\t\t2020年3月 Created by @DL小寶
//\t\t2020年3月 Revised by @DL小寶
//------------------------------------------------------------------------------------------------
//---------------------------------【頭文件、命名空間包含部分】----------------------------
//\t\t描述:包含程序所使用的頭文件和命名空間
//------------------------------------------------------------------------------------------------
#include <opencv2>
#include <opencv2>
#include <opencv2>
using namespace cv;
//-----------------------------------【main( )函數】------------------------------------------
//\t\t描述:控制檯應用程序的入口函數,我們的程序從這裡開始
//-----------------------------------------------------------------------------------------------
int main()
{
\t//載入原始圖
\tMat image = imread("xtx.jpg"); //工程目錄下應該有一張名為xtx.jpg的素材圖
\t//創建窗口
\tnamedWindow("【原始圖】形態學梯度");
\tnamedWindow("【效果圖】形態學梯度");
\t//顯示原始圖
\timshow("【原始圖】形態學梯度", image);
\t//定義核
\tMat element = getStructuringElement(MORPH_RECT, Size(15, 15));
\t//進行形態學操作
\tmorphologyEx(image, image, MORPH_GRADIENT, element);
\t//顯示效果圖
\timshow("【效果圖】形態學梯度", image);
\twaitKey(0);
\treturn 0;
}/<opencv2>/<opencv2>/<opencv2>/<code>
4.可視化
可以看出,輪廓提取的效果還是不錯滴!
閱讀更多 DL小寶 的文章