OpenCV形態學運算
1.OpenCV形態學運算morphologyEx(開運算 、閉運算 、形態學梯度 、頂帽運算 、黑帽運算 、腐蝕運算 、膨脹運算 、擊中擊不中運算)
void cv::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() )
InputArray src: 輸入影象,可以是Mat型別,對於影象通道數無要求,但影象深度必須是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F
. OutPutArray dst: 目標影象,與原影象尺寸核型別相同
. int op: 形態學運算的型別,可以通過MorphTypes檢視,如下所示:
識別符號 | 運算型別
MORPH_OPEN: 開運算
MORPH_CLOSE :閉運算
MORPH_GRADIENT: 形態學梯度
MORPH_TOPHAT:頂帽運算
MORPH_BLACKHAT: 黑帽運算
MORPH_ERODE :腐蝕運算
MORPH_DILATE
MORPH_HITMISS: 擊中擊不中運算(只支援CV_8UC1型別的二值影象)
. InputArray kernel: 形態學運算的核心,如果是Mat()則表示的是參考點位於核心中心3x3的核,前面也提到一般使用前需要定義一個Mat變數結合getStructuringElement()函式使用,getStructuringElement會返回指定形狀和尺寸的結構元素,這裡再重申一下getStructuringElement的引數,其函式原型如下:
Mat cv::getStructuringElement ( int shape, Size ksize, Point anchor = Point(-1,-1) )
int shape: kernel的形狀,由cv::MorphShapes指定,如下:
分別是矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、橢圓形(MORPH_ELLIPSE)
. Size ksize: kernel的尺寸
. Point anchor = Point(-1, -1): 錨點位置
. Point anchor=Point(-1, -1): 錨點位置
. int iterations=1: 迭代使用函式的次數,預設值為1
. int borderType=BORDER_CONSTANT: 用於推斷影象外部畫素的某種邊界模式,有預設值BORDER_CONSTANT
. const Scalar & borderValue=morphologyDefaultBorderValue(): 當邊界為常數時的邊界值,可以通過createMorphologyFilter() 檢視更多細節。
這些形態學操作都是可執行就地操作(in-place),對於多通道影象,每個影象通道進行單獨操作。
2.示例
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat srcImage = cv::imread("1.png", 1);
if (!srcImage.data)
return 1;
Mat srcGray;
cvtColor(srcImage, srcGray, CV_BGR2GRAY);
// 定義結構元素
Mat element = getStructuringElement(
MORPH_RECT, Size(15, 15));
Mat topHatMat, blackHatMat;
// 形態學Top-Hat 頂帽
morphologyEx(srcGray, topHatMat,
MORPH_TOPHAT, element);
// 形態學Top-Hat 黑帽
morphologyEx(srcGray, blackHatMat,
MORPH_BLACKHAT, element);
Mat Object_img;
Object_img = srcGray + topHatMat - blackHatMat;
imshow(" srcGray ", srcGray);
imshow(" topHatMat ", topHatMat);
imshow(" blackHatMat ", blackHatMat);
imshow(" Object_img ", blackHatMat);
waitKey(0);
return 0;
}