Aprendizagem OpenCV: manipulação básica de imagens (6): manipulação morfológica

Conceito básico

corrosão

A corrosão pode ser entendida como o centro de B (ponto de ancoragem) caminhando ao longo do limite interno de A em um círculo. Para corrosão também parte destaque , com excepção da região porções Um <pixel de um destaque , o qual é substituído no exterior.

Inchar

A expansão pode ser entendida como o centro de B (ponto de ancoragem) caminhando ao longo do limite externo de A em um círculo. Para a expansão é parte de realce , com excepção da região porções Um <destaque de pixel Um , o qual é substituído no exterior.

Operação aberta

Por para a primeira 腐蚀operação, então 膨胀a operação obtida. Somos muito úteis ao remover pequenos objetos (supondo que o objeto seja brilhante e a cor do primeiro plano seja preta), que é usado para apagar o ruído mais claro do que o fundo .

Operação fechada

闭运算É uma operação inversa da operação de abertura, em particular para ser 膨胀então 腐蚀operada , usada para apagar mais escuro que o ruído de fundo .

Gradiente morfológico

A subtração da imagem corroída da imagem dilatada pode ser usada para extrair as bordas da imagem.

Algoritmo de cartola

A diferença entre a imagem original e a imagem após a operação de abertura é usada para extrair o primeiro plano do alvo pequeno e brilhante.

Algoritmo de chapéu preto

A diferença entre a imagem original e a imagem após a operação e o primeiro plano do alvo pequeno sem destaque é removido.

Introdução API

Expansão e corrosão

//获取,卷积核
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//指定                                       卷积核形状     大小      锚点位置(-1为中心)      


dilate(src, dst, structureElement, Point(-1, -1), 1);
//    源图  结果   卷积核             锚点      迭代次数

erode(src, dst, structureElement);
//默认 锚点为中心点  迭代次数为 1

Outras operações morfológicas

//同样先获得,卷积核:
// MORPH_RECT  矩形    MORPH_CROSS  十字形    MORPH_ELLIPSE   椭圆形
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));

//调用morphologyEx
morphologyEx(src, dst, MORPH_BLACKHAT, structureElement);
//          原图,结果,运算类型         运算核 


/*******************************************************************************

MORPH_CLOSE  闭
MORPH_OPEN   开
MORPH_GRADIENT   梯度
MORPH_TOPHAT      顶帽
MORPH_BLACKHAT    黑帽
MORPH_DILATE      膨胀
MORPH_ERODE       腐蚀
*********************************************************************************/      

Prática de código

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

using namespace cv;
using namespace std;
Mat src,dst;
int element_size = 3;
int max_size = 25;
char OUTPUT[] = "OUTPUT_WINDOS";

void CallBack_Demo(int, void*)
{
	int s = element_size * 2 + 1;
	Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
	//膨胀与腐蚀
	//dilate(src, dst, structureElement, Point(-1, -1), 1);
	//erode(src, dst, structureElement);

	//闭
	//morphologyEx(src,dst,MORPH_CLOSE,structureElement);
        //开
	//morphologyEx(src, dst, MORPH_OPEN, structureElement);
	//梯度
	//morphologyEx(src, dst, MORPH_GRADIENT, structureElement);
	//顶帽
	//morphologyEx(src, dst,MORPH_TOPHAT , structureElement);
	//黑帽
	morphologyEx(src, dst, MORPH_BLACKHAT, structureElement);
	imshow(OUTPUT, dst);
	return;
}


int main(int argc, char* argv[])
{
	//src = imread("src.jpg");
	src = imread("1.PNG");
	if (!src.data)
	{
		cout << "cannot open image" << endl;
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image",src);
	namedWindow(OUTPUT,WINDOW_AUTOSIZE);
	createTrackbar("Element Size:", OUTPUT, &element_size, max_size, CallBack_Demo);
	CallBack_Demo(0, 0);
	waitKey(0);
	return 0;
}

 

 

Acho que você gosta

Origin blog.csdn.net/fan1102958151/article/details/106996717
Recomendado
Clasificación