Aprendizaje OpenCV: manipulación básica de imágenes (6): manipulación morfológica

Concepto basico

corrosión

La corrosión puede entenderse como el centro de B (punto de anclaje) que camina a lo largo del límite interior de A en un círculo. Para la corrosión también parte más destacado , partes distintas de la región A <destacado pixel A , que está sustituido en el exterior.

Hinchar

La expansión puede entenderse como el centro de B (punto de anclaje) caminando a lo largo del límite exterior de A en un círculo. Para la expansión es parte culminante , partes distintas de la región A <destacado pixel A , que está sustituido en el exterior.

Operación abierta

Por para la primera 腐蚀operación, luego 膨胀la operación obtenida. Somos muy útiles a la hora de eliminar objetos pequeños (asumiendo que el objeto es brillante y el color de primer plano es negro), que se utiliza para borrar el ruido que es más brillante que el fondo .

Operación cerrada

闭运算Es una operación inversa de la operación de apertura, en particular para ser operada 膨胀luego腐蚀 , utilizada para borrar más oscuro que el ruido de fondo .

Gradiente morfológico

Restar la imagen corroída de la imagen dilatada se puede utilizar para extraer los bordes de la imagen.

Algoritmo de sombrero de copa

La diferencia entre la imagen original y la imagen después de la operación de apertura se utiliza para extraer el primer plano del objetivo pequeño brillante.

Algoritmo de sombrero negro

Se elimina la diferencia entre la imagen original y la imagen después de la operación, y el primer plano del objetivo pequeño no resaltado.

Introducción a la API

Expansión y corrosión

//获取,卷积核
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

Otras operaciones 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áctica del 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;
}

 

 

Supongo que te gusta

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