圖像處理之形態學黑帽運算

1.認識黑帽運算

圖像黑帽運算

是圖像經過閉運算操作後再減去原始圖像的結果,得到圖像內部的小孔,或者前景色中的小黑點部分。表達式如下:

<code>dst = blackhat(src,element) = close(src,element) - src/<code>

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=morphologyDefaultBorderValue() );/<code>

參數解釋:

  • src:輸入圖像,即源圖像,填Mat類的對象即可。圖像位深應該為以下五種之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
  • dst:OutputArray類型的dst,即目標圖像,函數的輸出參數,需要和源圖片有一樣的尺寸和類型。
  • op:int類型的op,表示形態學運算的類型。
  • kernel:InputArray類型的kernel,形態學運算的內核。若為NULL時,表示的是使用參考點位於中心3x3的核。我們一般使用函數 getStructuringElement()配合這個參數的使用。getStructuringElement()函數會返回指定形狀和尺寸的結構元素(內核矩陣)。關於getStructuringElement()函數,請見文章裡有相關講解:【拜小白opencv】36-形態學濾波1——腐蝕
  • anchor:Point類型的anchor,錨的位置,其有默認值(-1,-1),表示錨位於中心。
  • iterations:int類型的iterations,迭代使用函數的次數,默認值為1。
  • borderType:int類型的borderType,用於推斷圖像外部像素的某種邊界模式。注意它有默認值BORDER_ CONSTANT。
  • borderValue:const Scalar&類型的borderValue,當邊界為常數時的邊界值,有默認值morphologyDefaultBorderValue(),一般我們不用去管他。需要用到它時,可以看官方文檔中的createMorphologyFilter()函數得到更詳細的解釋。

往往只需要填前面的四個參數,後面的四個參數都有默認值。

3.C++實現

<code>//--------------------------------------【程序說明】-------------------------------------------
//\t\t程序描述:形態學黑帽運算
//\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("hmm.jpg"); //工程目錄下應該有一張名為hmm.jpg的素材圖
\t//創建窗口
\tnamedWindow("【原始圖】黑帽運算");
\tnamedWindow("【效果圖】黑帽運算");
\t//顯示原始圖
\timshow("【原始圖】黑帽運算", image);
\t//定義核
\tMat element = getStructuringElement(MORPH_RECT, Size(15, 15));
\t//進行形態學操作
\tmorphologyEx(image, image, MORPH_BLACKHAT, element);
\t//顯示效果圖
\timshow("【效果圖】黑帽運算", image);
\twaitKey(0);
\treturn 0;
}/<opencv2>/<opencv2>/<opencv2>/<code>

4.可視化


圖像處理之形態學黑帽運算


圖像處理之形態學黑帽運算


分享到:


相關文章: