Pertanyaan OpenCV: bagaimana menerapkan peta gradien pelangi pada gambar?


Katakanlah kami memiliki gambar yang entah bagaimana kami modifikasi melalui openCV:

enter image description here

Dan sekarang kami ingin menerapkannya Gradient Map (seperti yang bisa kita terapkan via photoshop):

enter image description here

Jadi saya bertanya-tanya bagaimana menerapkan peta gradien (warna pelangi) melalui openCV?


8
2018-04-06 23:26


asal


Jawaban:


Berikut ini adalah metode untuk membuat gambar palsu / pseudo-warna menggunakan Python, konversi ke c + + harus sangat mudah. Ringkasan:

  1. Buka gambar Anda sebagai grayscale, dan RGB
  2. Konversi gambar RGB ke ruang warna HSV (Hue, Saturation, Value / Brightness). Ini adalah ruang silindris, dengan warna diwakili oleh satu nilai pada sumbu kutub.
  3. Setel saluran rona ke gambar grayscale yang sudah kami buka, ini adalah langkah penting.
  4. Atur nilai, dan saluran saturasi keduanya ke nilai maksimal.
  5. Konversikan kembali ke ruang RGB (jika tidak, tampilan akan salah).

Ada beberapa tangkapan meskipun ...

  1. Karena Hue dipegang dalam derajat dan spektrum warna direpresentasikan dari 0 hingga 180 (bukan 0-256 dan bukan 0-360 (kadang kala)), kita perlu menskala ulang gambar grayscale secara tepat dengan mengalikan dengan 180 / 256.0
  2. Dalam kasus pembuka warna rona mulai berwarna biru (bukan merah, seperti pada gambar Anda). yaitu. pemetaan berjalan seperti ini:

dari: enter image description here untuk: enter image description here

Jika ini penting untuk diubah, kita dapat melakukannya dengan mengimbangi semua elemen rona dan membungkusnya sekitar 180 (jika tidak maka akan jenuh). Kode melakukan ini dengan menyamarkan gambar pada titik potong ini dan kemudian mengimbangi secara tepat. Menggunakan offset 120, menghasilkan skala warna Anda:

dari: enter image description here untuk: enter image description here 

dan gambar yang diproses dengan cara ini tampaknya sangat cocok dengan Anda (pada akhirnya).

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)

Gambar Anda diproses dengan offset = 120:

enter image description here


12
2018-04-09 07:28



Sekarang ada fungsi openCV disebut applyColorMap yang membuat proses ini sepele. Kode berikut akan melakukan trik

image_cm = cv2.applyColorMap(image, cv2.COLORMAP_JET))

Dan inilah hasilnya:

Original plane Gambar 1: Pesawat asli Plane after applying colormap Figure2: Plane setelah menerapkan colormap


0
2017-12-14 09:53