1. 程式人生 > >OpenCV形態學運算

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_8UCV_16UCV_16SCV_32FCV_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: 迭代使用函式的次數,預設值為
. 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;

}