1. 程式人生 > >形態學:開、閉、梯度、頂帽、黑帽

形態學:開、閉、梯度、頂帽、黑帽

原理

下面的element指的是進行操作的核

  • 開操作(opening):
    d s t = d i
    l a t e ( e r o
    d e ( s r c , e
    l e m e n t ) ) dst=dilate(erode(src,element))

    作用:
  1. 平滑物體的輪廓
  2. 斷開較窄的交界處
  3. 消除細小的噪聲、突出物
    作用3




  • 閉操作(closing):
    d s t = e r o d e ( d i l a t e ( s r c , e l e m e n t ) ) dst=erode(dilate(src,element))
    作用:
  1. 平滑物體的輪廓
  2. 彌合較窄的交界處,填補輪廓線的斷裂
  3. 消除細小的孔洞
    在這裡插入圖片描述
  • 形態學梯度(Morphological Gradient):
    d s t = d i l a t e ( s r c , e l e m e n t ) e r o d e ( s r c , e l e m e n t ) dst=dilate(src,element)−erode(src,element)
    作用:提取物體輪廓

在這裡插入圖片描述







  • 頂帽(top hat):
    d s t = s r c o p e n ( s r c , e l e m e n t ) dst=src−open(src,element)


.





  • 黑帽(black hat):
    d s t = c l o s e ( s r c , e l e m e n t ) s r c dst=close(src,element)−src





官方程式碼

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int morph_elem=0;
int morph_size=0;
int morph_operator=0;
int const max_operator=4;
int const max_elem=2;
int const max_kernel_size=21;

const char* window_name = "Morphlogy Transformation Demo";

void Morphlogy_Opertions(int , void*);

Mat src,dst;

int main(void)
{
	
    src = cv::imread("../res/1.jpg");
	if(src.empty())
	{
		cout << "load image failed" << endl;	
		return -1;
	}
	

	cv::namedWindow(window_name,cv::WINDOW_NORMAL);

//建立Trackbar
	cv::createTrackbar("Operator:\n 0:Opening-1:Closing\n2:Gradient-3:Top hat\n4:Black hat",window_name,&morph_operator,max_operator,Morphlogy_Opertions);
	cv::createTrackbar("Element:\n 0:Rect-1:Cross-2:Ellipse",window_name,&morph_elem,max_elem,Morphlogy_Opertions);
	cv::createTrackbar("Kernel size:\n2n+1",window_name,&morph_size,max_kernel_size,Morphlogy_Opertions);


	Morphlogy_Opertions(0,NULL);

	waitKey(0);
	return 0;

};


void Morphlogy_Opertions(int , void*)
{

	int operations= morph_operator+2; //因為第一個是開操作,列舉是2
	Mat element = cv::getStructuringElement(morph_elem,Size(2*morph_size+1,2*morph_size+1),Point(morph_size,morph_size));

	cv::morphologyEx(src,dst,operations,element);
	imshow(window_name,dst);


}

結果:
在這裡插入圖片描述

在這裡插入圖片描述



OpenCV API

此函式可以進行多種形態學操作:腐蝕、膨脹、開、等等

void cv::morphologyEx (
InputArray src,&emsp   //原圖
OutputArray dst,&emsp   //輸出圖
int op,&emsp   // 進行的具體的形態學操作,列舉如下
InputArray kernel,&emsp   //核(可以根據cv::getStructuringElement得到)
Point anchor = Point(-1,-1),&emsp   //錨點(預設)
int iterations = 1,&emsp   //進行此操作的次數(預設)
int borderType = BORDER_CONSTANT,&emsp   //邊界的處理(預設)
const Scalar & borderValue = morphologyDefaultBorderValue() &emsp   //邊界的常數值(預設)
)

列舉名 數值 操作
MORPH_ERODE 0 腐蝕
MORPH_DILATE 1 膨脹
MORPH_OPEN 2
MORPH_CLOSE 3
MORPH_GRADIENT 4 形態梯度
MORPH_TOPHAT 5 頂帽
MORPH_BLACKHAT 6 黑帽
MORPH_HITMISS 7 擊中、不擊中