1.認識頂帽運算
所謂的頂帽運算,就是原圖像與開運算的結果圖之差值
其數學表達式為:
<code>dst = tophat(src,element) = src - open(src,element)/<code>
1.1運用場景
(1).因為開運算帶來的結果是放大像素裂縫或者局部亮度低的區域。所以呢從原圖中減去開運算後的圖像,得到的效果圖就突出了比原圖輪廓周圍的區域更明亮的區域,且這一操作與選擇的核的的大小相關。
(2).頂帽運算往往用來分離比臨近點亮一些的斑塊,在一幅圖像背景佔比大,而小物品有規律的情況下,可使用頂帽運算進行背景提取。
(3).頂帽操作常用與檢測圖像中的峰結構。

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

閱讀更多 DL小寶 的文章