23. reasignación de píxeles

1. Contenido principal

  • Introducción a la reasignación de píxeles
  • Introducción a la API
  • Código de demostración

2. Introducción a la reasignación de píxeles

  • En pocas palabras, cada píxel en la imagen de entrada se asigna a la posición correspondiente de otra imagen de acuerdo con ciertas reglas para formar una nueva imagen.
    Inserte la descripción de la imagen aquí
    g (x, y) es la imagen después de la reasignación, h (x, y) es la función de función yf es la imagen de origen.
    Inserte la descripción de la imagen aquí
    Suponga que hay una función de mapeo

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

3. Introducción a la API cv :: remap

Remap(
InputArray src,// 输入图像,需要单通道8位或者浮点类型的图像
OutputArray dst,// 输出图像,需和原图形一样的尺寸和类型
InputArray  map1,
//它有两种可能表示的对象:(1)表示点(x,y)的第一个映射;(2)表示CV_16SC2,CV_32FC1等
InputArray map2,
//它有两种可能表示的对象:(1)若map1表示点(x,y)时,这个参数不代表任何值;(2)表示CV_16UC1,CV_32FC1类型的Y值
int interpolation,// 选择的插值方法,常见线性插值,可选择立方等
int borderMode,//默认BORDER_CONSTANT,边缘填充方式
const Scalar borderValue// color,填充颜色,默认黑色
)

Existen cuatro métodos de interpolación:
(1) INTER_NEAREST-interpolación vecina más cercana
(2) INTER_LINEAR-interpolación bilineal (predeterminado)
(3) INTER_CUBIC-doble interpolación triple spline (predeterminado)
(4) INTER_LANCZOS4- —Interpolación de Lanczos (predeterminado)

  • Reduzca a la mitad (esta vez use un método de diferencia lineal)
    Inserte la descripción de la imagen aquí
  • Intercambio de dirección Y
    Inserte la descripción de la imagen aquí
  • X cambio de dirección
    Inserte la descripción de la imagen aquí
  • Dirección XY intercambiada al mismo tiempo
    Inserte la descripción de la imagen aquí

4. Código de demostración

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

using namespace cv;
Mat src, dst, map_x, map_y;
const char* OUTPUT_TITLE = "remap demo";
int index = 0;
void update_map(void);
int main(int argc, char** argv) {
	src = imread("D:/vcprojects/images/test.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	char input_win[] = "input image";
	namedWindow(input_win, CV_WINDOW_AUTOSIZE);
	namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
	imshow(input_win, src);

	map_x.create(src.size(), CV_32FC1);
	map_y.create(src.size(), CV_32FC1);

	int c = 0;
	while (true) {
		c = waitKey(500);
		if ((char)c == 27) {
			break;
		}
		index = c % 4;
		update_map();//被调用的代码映射函数
		remap(src, dst, map_x, map_y, INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 255, 255));
		imshow(OUTPUT_TITLE, dst);
	}

	return 0;
}

void update_map(void) {
	for (int row = 0; row < src.rows; row++) {
		for (int col = 0; col < src.cols; col++) {
			switch (index) {
			case 0:
				if (col > (src.cols * 0.25) && col <= (src.cols*0.75) && row > (src.rows*0.25) && row <= (src.rows*0.75)) {
					map_x.at<float>(row, col) = 2 * (col - (src.cols*0.25));
					map_y.at<float>(row, col) = 2 * (row - (src.rows*0.25));
				}
				else {
					map_x.at<float>(row, col) = 0;
					map_y.at<float>(row, col) = 0;
				}
				break;
			case 1:
				map_x.at<float>(row, col) = (src.cols - col - 1);
				map_y.at<float>(row, col) = row;
				break;
			case 2:
				map_x.at<float>(row, col) = col;
				map_y.at<float>(row, col) = (src.rows - row - 1);
				break;
			case 3:
				map_x.at<float>(row, col) = (src.cols - col - 1);
				map_y.at<float>(row, col) = (src.rows - row - 1);
				break;
			}

		}
	}
}

El valor de retorno de la función waitKey es el código ASCIOI de la clave actual

5. Expansión extracurricular

Nota: Un crimen sangriento causado por la tecla de espera en el procesamiento de entrada de OpenCV [OpenCV] OpenCV (evento event_keyboard event_slider del mouse
)

(Nota: esta función es el único método en HighGUI que puede buscar y manejar eventos) Es igual a la operación predeterminada de esta función.

Observación de imágenes: vea imágenes en la memoria en el depurador de Visual Studio

Publicado 66 artículos originales · ganado elogios 53 · vistas 6812

Supongo que te gusta

Origin blog.csdn.net/qq_43367829/article/details/105424623
Recomendado
Clasificación