Ecco un metodo per creare immagini false/pseudo-colore usando Python, la conversione in C++ dovrebbe essere molto semplice. Panoramica:
- aprire l'immagine in scala di grigi, RGB e
- convertire l'immagine RGB per HSV (tonalità, saturazione, valore/luminosità) spazio colore. Questo è uno spazio cilindrico, con la tonalità rappresentata da un singolo valore sull'asse polare.
- Imposta il canale di tonalità sull'immagine in scala di grigi che abbiamo già aperto, questo è il passaggio cruciale.
- Imposta il valore e i canali di saturazione entrambi ai valori massimi.
- Converti nello spazio RGB (altrimenti la visualizzazione sarà errata).
Ci sono un paio di catture però ...
- Come Hue si tiene in gradi e lo spettro colore è rappresentato da 0 a 180 (non 0-256 e non 0-360 (talvolta caso)), è necessario ridimensionare l'immagine in scala di grigio in modo appropriato moltiplicando per
180/256.0
- Nel caso in cui la tonalità colorscale inizia in blu (non rosso, come nella tua immagine). vale a dire. la mappatura va in questo modo:
da: a:
Se questo è importante per cambiare che possiamo fare in modo mediante compensazione di tutti gli elementi di tonalità e confezionamento di loro circa 180 (in caso contrario verranno saturati). Il codice esegue questa operazione mascherando l'immagine in questo punto di interruzione e quindi compensando opportunamente. Usando un offset di 120, genera il vostro ColorScale:
da: a:
e l'immagine elaborata in questo modo sembra corrispondere vostro molto bene (alla fine).
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)
L'immagine elaborata con offset = 120
:
Beh, non so nulla su OpenCV, ma il processo è diviso in due parti, da RGB a scala di grigi, e quindi Grayscale torna a RGB usando quel gradiente. Vedi [qui] (http://nashruddin.com/opencv-examples-for-operation-on-images.html/5) per la prima parte e [qui] (http://stackoverflow.com/questions/6686868/opencv-color-mapping-with-direct-pixel-access) per il secondo. – scientiaesthete