Este es un método para crear imágenes falsas/pseudocolor utilizando Python, la conversión a C++ debería ser muy sencilla. Descripción general:
- Abra la imagen en escala de grises, RGB y
- convertir la imagen RGB a HSV (Tono, Saturación, Valor/Brillo) espacio de color. Este es un espacio cilíndrico, con matiz representado por un único valor en el eje polar.
- Establezca el canal de tono en la imagen en escala de grises que ya abrimos, este es el paso crucial.
- Establezca el valor y los canales de saturación en valores máximos.
- Convertir de nuevo a espacio RGB (de lo contrario, la visualización será incorrecta).
Hay un par de capturas aunque ...
- Como Hue se mantiene en grados y el espectro de color se representa de 0 a 180 (no 0-256 y 0-360 no (a veces el caso)), tenemos que cambiar la escala de la imagen en escala de grises de manera apropiada multiplicando por
180/256.0
- En el caso de opencv, la escala de colores del matiz comienza en azul (no en rojo, como en su imagen). es decir. la asignación es la siguiente:
de: a:
Si esto es importante para cambiar podemos hacerlo mediante la compensación de todos los elementos de tono y envolviéndolos alrededor de 180 (de lo contrario saturará). El código hace esto enmascarando la imagen en este punto de corte y luego compensando apropiadamente. El uso de un desplazamiento de 120, genera su ColorScale:
de: a:
y la imagen procesada de esta manera parece coincidir con el suyo muy bien (al final).
import cv
image_bw = cv.LoadImage("TfBmw.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
image_rgb = cv.LoadImage("TfBmw.jpg")
#create the image arrays we require for the processing
hue=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
sat=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
val=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
mask_1=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
mask_2=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
#convert to cylindrical HSV color space
cv.CvtColor(image_rgb,image_rgb,cv.CV_RGB2HSV)
#split image into component channels
cv.Split(image_rgb,hue,sat,val,None)
#rescale image_bw to degrees
cv.ConvertScale(image_bw, image_bw, 180/256.0)
#set the hue channel to the greyscale image
cv.Copy(image_bw,hue)
#set sat and val to maximum
cv.Set(sat, 255)
cv.Set(val, 255)
#adjust the pseudo color scaling offset, 120 matches the image you displayed
offset=120
cv.CmpS(hue,180-offset, mask_1, cv.CV_CMP_GE)
cv.CmpS(hue,180-offset, mask_2, cv.CV_CMP_LT)
cv.AddS(hue,offset-180,hue,mask_1)
cv.AddS(hue,offset,hue,mask_2)
#merge the channels back
cv.Merge(hue,sat,val,None,image_rgb)
#convert back to RGB color space, for correct display
cv.CvtColor(image_rgb,image_rgb,cv.CV_HSV2RGB)
cv.ShowImage('image', image_rgb)
# cv.SaveImage('TfBmw_120.jpg',image_rgb)
cv.WaitKey(0)
Su imagen procesada con offset = 120
:
Bueno, no sé nada sobre OpenCV, pero el proceso se divide en dos partes, RGB a escala de grises, y luego escala de grises a RGB usando ese gradiente. Ver [aquí] (http://nashruddin.com/opencv-examples-for-operation-on-images.html/5) para la primera parte, y [aquí] (http://stackoverflow.com/questions/6686868/opencv-color-mapping-with-direct-pixel-access) para el segundo. – scientiaesthete