1.11【OpenCV圖像處理】形態學操作
開、閉、梯度、頂帽、黑帽、morphologyEx
1.11.1 開、閉、梯度、頂帽、黑帽
(1)開操作(open):先腐蝕後膨脹。
作用:可以去掉小的白噪點,填充小的白洞。能排除小區域物體、消除孤立點、去噪、平滑物體的輪廓。
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); //結構元素nmorphologyEx(src, dst1, CV_MOP_OPEN, kernel); //開操作,先腐蝕後膨脹n
如下假設對象是前景色,背景是黑色,腐蝕可把小白點去掉,膨脹又把主對象被腐蝕掉的部分還原回來。
(2)閉操作(close):先膨脹後腐蝕(bin2)
作用:可以填充小的黑洞(fill hole補洞),去掉小的黑噪點。填充目標區域內的離散小空洞和分散部分。
morphologyEx(src, dst2, CV_MOP_CLOSE, kernel); //閉操作,先膨脹後腐蝕n如下假設對象是前景色,背景是黑色n
(3)形態學梯度(Gradient):膨脹減去腐蝕,又稱為基本梯度,沒進一階像素值不一樣
作用:邊緣提取,對二值圖像進行這一操作,可以將團塊(blob)的邊緣突出出來,保留物體的邊緣輪廓。
morphologyEx(src, dst3, CV_MOP_GRADIENT, kernel); //梯度,膨脹減腐蝕,邊緣提取n
其它還有內部梯度(原圖減去腐蝕)、外部梯度(膨脹減去原圖)、方向梯度(x方向和y方向進行計算)
(4)頂帽(top hat):是原圖像與開操作之間的差值圖像
作用:顯示開操作所去掉的小白噪點。
morphologyEx(src, dst4, CV_MOP_TOPHAT, kernel); //頂帽,原圖與開操作之差
(5)黑帽(black hat):閉操作圖像與源圖像的差值圖像
作用:顯示閉操作所填充的小黑洞。
morphologyEx(src, dst5, CV_MOP_BLACKHAT, kernel); //黑帽,閉操作與原圖之差n
1.11.2 相關API
morphologyEx(src, dest, CV_MOP_BLACKHAT, kernel);
- Mat src – 輸入圖像
- Mat dest – 輸出結果
- int OPT 形態學操作類型: CV_MOP_OPEN開/ CV_MOP_CLOSE閉/ CV_MOP_GRADIENT 梯度/ CV_MOP_TOPHAT頂帽/ CV_MOP_BLACKHAT黑帽
- Mat kernel 結構元素
- int Iteration 迭代次數,不寫默認是1
)
完整程序:
/*1.11 形態學操作-開、閉、梯度、頂帽、黑帽*/n#include <opencv2/opencv.hpp>n#include <iostream> n#include <math.h>nusing namespace cv; //使用cv命名空間nnint main(int argc, char** argv) { //argc 表示命令行輸入參數的個數(以空白符分隔),argv中存儲了所有的命令行參數nMat src, dst1, dst2, dst3, dst4, dst5;n src = imread("E:/OpenCV/testimage/gray1.jpg");nif (src.empty()) {n printf("could not load image...n");nreturn -1;n }n namedWindow("input image", CV_WINDOW_AUTOSIZE);n imshow("input image", src);nnMat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));n morphologyEx(src, dst1, CV_MOP_OPEN, kernel); //開操作,先腐蝕後膨脹n imshow("open image", dst1);nn morphologyEx(src, dst2, CV_MOP_CLOSE, kernel); //閉操作,先膨脹後腐蝕n imshow("close image", dst2);nn morphologyEx(src, dst3, CV_MOP_GRADIENT, kernel); //梯度,膨脹減腐蝕,邊緣提取n imshow("gradient image", dst3);nn morphologyEx(src, dst4, CV_MOP_TOPHAT, kernel); //頂帽,原圖與開操作之差n imshow("tophat image", dst4);nn morphologyEx(src, dst5, CV_MOP_BLACKHAT, kernel); //黑帽,閉操作與原圖之差n imshow("blackhat image", dst5);nn waitKey(0);nreturn 0;n}n
運行結果:
原圖1:gray1
原圖2:gray3 黑背景
原圖2取反:~gray3 白背景
推薦閱讀:
※視覺演算法研發工程師/嵌入式AI全棧(實習/全棧)(20K-40K/月)
※Neural Artistic Style
※1.15【OpenCV圖像處理】自定義線性濾波
※[轉自github]基於深度學習的醫療影像論文匯總(Deep Learning Papers on Medical Image Analysis)
※《SegNet: A Deep ConvolutionalnEncoder-Decoder Architecture for ImagenSegmentation》論文筆記