Tengo una imagen de escala de grises que quiero mostrar en color mapeando los valores de escala de grises con una paleta de colores (como el mapa de colores en Matlab).Asignación de color de Opencv con acceso directo de píxeles
Logré hacerlo utilizando la función OpenCV cvSet2D, pero me gustaría acceder a los píxeles directamente por motivos de rendimiento.
Pero cuando hago eso la imagen tiene colores extraños. Traté de configurar los colores en diferentes órdenes (RGB, BGR, ...) pero parece que no puedo evitarlo.
No es mi código:
IplImage* temp = cvCreateImage(cvSize(img->width/scale,img->height/scale), IPL_DEPTH_8U, 3);
for (int y=0; y<temp->height; y++)
{
uchar* ptr1 = (uchar*) (temp->imageData + y * temp->widthStep);
uchar* ptr2 = (uchar*) (img->imageData + y * img->widthStep);
for (int x=0; x<temp->width; x++)
{
CvScalar v1;
int intensity = (int)ptr2[x];
int b=0, g=0, r=0;
r = colormap[intensity][0];
g = colormap[intensity][1];
b = colormap[intensity][2];
if (true)
{
ptr1[3*x] = b;
ptr1[3*x+1] = g;
ptr1[3*x+2] = r;
}
else
{
v1.val[0] = r;
v1.val[1] = g;
v1.val[2] = b;
cvSet2D(temp, y, x, v1);
}
}
}
Cambiar el caso de (verdadero) si al (falso) para un acceso diferente de píxeles.
El resultado correcto es con cvSet2D:
El resultado malo con el acceso directo a memoria:
Gracias por su ayuda
No se puede ver ningún error en este momento. El orden correcto de bytes debe ser BGR dentro de 'imageData'. ¿Cómo cambia la imagen si cambia el orden de bytes? Debería cambiar, de lo contrario estás haciendo algo mal. Intente hacer un solo color (deje otros canales en 0/negro). Y mira si encajan. La alineación parece ser correcta, pero estoy un poco confundido sobre el duro contraste alrededor de las esquinas. – Mario
Descubrí mi error ... De hecho, es RGB, pero ese no era el problema, tenía valores de color en 256 en lugar de 255 ... Realmente lo siento ... Creo que hacer la pregunta me ayudó a encontrar la respuesta. – david
Ahh ... está bien. Eso explica el fuerte contraste (debido a los desbordamientos y tal).:) – Mario