El cambio de tamaño de la interpolación bilineal se da cuenta de la escala de la imagen

El cambio de tamaño de la interpolación bilineal se da cuenta de la escala de la imagen

La implementación de interpolación bilineal redimensionada de Opencv es
simple y simple. Dos imágenes ilustran el principio. Puede comprender el principio después de una mirada cuidadosa. No tenga miedo de la fórmula matemática en la Figura 2. Sabrá lo simple que es.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Si comprende el principio, veamos la realización.
El punto clave aquí es establecer un sistema de coordenadas basado en el centro de las dos imágenes para el cálculo.
El punto negro es el origen de las coordenadas.
La figura en el punto negro es el origen de las coordenadas, cuando la primera imagen durante el zoom es el enfoque incorrecto, la segunda forma correcta de calcular el origen de las coordenadas centrales, y eso es importante tener en cuenta, ** cuando usa el Los números de coma flotante se truncan y convierten, y las operaciones para encontrar x1, x2, y1 e y2 en diferentes cuadrantes son diferentes . ** Por ejemplo, -3.5 obtiene -3 y -4, que son los valores de x-1, mientras que 3.5 obtiene 3 y 4, que son los valores de x y x + 1.
Adjuntar mi codigo

void resize(int srcH, int srcW, int dstH, int dstW, uchar src[], uchar dst[]) {
    
    
	int ox = (srcW - 1) / 2.0;
	int oy = (srcH - 1) / 2.0;
	float sx = ox * 2.0 / dstW;
	float sy = oy * 2.0 / dstH;
	for (int i = 0; i < dstH; i++) {
    
    
		for (int j = 0; j < dstW; j++) {
    
    
			float rx = 1.0* j * sx - ox;
			float ry = 1.0*i * sy - oy;
			int x = rx;
			int y = ry;
			float q = 0;
			int y1 = y + oy > srcH ? srcH : y + oy; y1 = y1 < 0 ? 0 : y1;
			int y2 = y + oy + (y > 0 ? 1 : -1) > srcH ? srcH : y + oy + (y > 0 ? 1 : -1); y1 = y1 < 0 ? 0 : y1;
			int x1 = x + ox > srcW ? srcW : x + ox; x1 = x1 < 0 ? 0 : x1;
			int x2 = x + ox + (x > 0 ? 1 : -1) > srcW ? srcW : x + ox + (x > 0 ? 1 : -1); x2 = x2 < 0 ? 0 : x2;
			float q1 = (x > 0 ? 1 : -1)*(x + (x > 0 ? 1 : -1) - rx)*src[y1*srcW + x1] + (x > 0 ? 1 : -1)*(rx - x)*src[y1*srcW + x2];
			float q2 = (x > 0 ? 1 : -1)*(x + (x > 0 ? 1 : -1) - rx)*src[y2*srcW + x1] + (x > 0 ? 1 : -1)*(rx - x)*src[y2*srcW + x2];
			q = (y > 0 ? 1 : -1)*(y + (y > 0 ? 1 : -1) - ry)*q1 + (y > 0 ? 1 : -1)*(ry - y)*q2;
			//cout << rx << "\t" << ry << endl;
			dst[i*dstW + j] = q;

		}
	}
}

Por favor, perdone mi código horrible, es demasiado tarde y soy demasiado vago para cambiarlo (no sé por qué está escrito de esta manera). Por cierto, soy un poco vago, por lo que el borde perderá píxeles.

Supongo que te gusta

Origin blog.csdn.net/weixin_45275421/article/details/109126608
Recomendado
Clasificación