Camino de exploración de OpenCV (trece): máscara de máscara detallada

En OpenCV nos encontramos a menudo con un nombre: Mask (máscara). Muchas funciones lo usan, entonces, ¿qué es exactamente esta máscara? Cuando entré en contacto por primera vez con la Máscara, estaba realmente confundido y no podía entender para qué era la Máscara. Después de consultar mucha información, también tengo un poco de comprensión de Mask. Permítanme hablar sobre mi comprensión a continuación.

Por ejemplo, si quiero recortar una imagen, necesito usar Máscara, así que usaré recorte como ejemplo para explicar el papel de Máscara en ella. Vaya primero al programa y luego analícelo oración por oración. La función de este programa es recortar el área especificada.

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int main()
{
	Mat image, mask;
	Rect r1(100, 100, 250, 300);
	Mat img1, img2, img3, img4;
	image = imread("lol17.jpg");
	mask = Mat::zeros(image.size(), CV_8UC1);
	mask(r1).setTo(255);
	img1 = image(r1);
	image.copyTo(img2, mask);

	image.copyTo(img3);
	img3.setTo(0, mask);


	imshow("Image sequence", image);
	imshow("img1", img1);
	imshow("img2", img2);
	imshow("img3", img3);
	imshow("mask", mask);

	waitKey();
	return 0;
}

La imagen original:

Preste atención a las dos frases del programa sobre el funcionamiento de la Máscara.

mask = Mat::zeros(image.size(), CV_8UC1); 
mask(r1).setTo(255);  //r1是设置好的感兴趣区域

Explique el funcionamiento de las dos oraciones anteriores.

  • El primer paso es crear una imagen de máscara del mismo tamaño que la imagen original e inicializar todos los píxeles a 0, de modo que toda la imagen se convierta en una imagen completamente negra.
  • En el segundo paso, todos los valores de píxeles en el área r1 en el mapa de máscara se establecen en 255, es decir, toda el área r1 se vuelve blanca.

De esta forma se puede obtener la imagen de la Máscara.

Presta atención a esta oración, ¿qué imagen se copia a qué imagen?

image.copyTo(img2, mask);

Por supuesto, la imagen de la imagen original se copia en la imagen de destino img2.
De hecho, la versión completa de la acción de copiar es la siguiente:

La imagen original (imagen) y la máscara (máscara) se combinan para obtener la imagen de resultado (img2).

¿Qué es la operación AND de un gráfico y una máscara?

De hecho, cada píxel de la imagen original y cada píxel correspondiente de la máscara tienen AND. Por ejemplo, 1 y 1 = 1, 1 y 0 = 0;

Por ejemplo, una imagen de 3 * 3 se calcula con una máscara de 3 * 3 y la imagen resultante es:

Para decirlo sin rodeos, la máscara es un mapa de bits, para elegir qué píxeles se pueden copiar y qué píxeles no se pueden copiar. Si el valor del píxel de la máscara no es cero, lo copio; de lo contrario, no lo copio.

Porque en la máscara que obtuvimos arriba, la región de interés es blanca, lo que indica que los píxeles en la región de interés son todos distintos de cero, y las regiones que no son de interés son todas negras, lo que indica que los píxeles en esas regiones son todos 0 . Una vez que la imagen original y la imagen de máscara se combinan con AND, la imagen resultante solo deja la imagen de la región de interés en la imagen original. También como se muestra a continuación.

image.copyTo(img2, mask);

Las siguientes dos líneas de código hacen lo mismo que arriba. Primero, copia la imagen de la imagen original a img3, y luego img3 establece el área blanca de la máscara en 0 (negro). Por ejemplo, si los píxeles en la máscara no son 0, estableceré mi El valor de píxel del punto correspondiente a la imagen se establece en 0, de lo contrario, no se hace nada. El pseudocódigo es si mask(i,j)>0 entonces img3(i,j)=0.

image.copyTo(img3);
img3.setTo(0, mask);

Si desea extraer directamente el área objetivo, simplemente escríbalo así:

img1 = image(r1);

Supongo que te gusta

Origin blog.csdn.net/weixin_58045467/article/details/130747211
Recomendado
Clasificación