Color Spaces – RGB – HSV – Lab/Cielab

By | July 27, 2024
342 Views

Ruang warna adalah model matematis yang menggambarkan bagaimana warna dapat direpresentasikan. Ini dijelaskan dalam rentang warna dan nilai luminansi yang spesifik, dapat diukur, dan tetap.

OpenCV mendukung ruang warna yang terkenal berikut ini:

  • Ruang warna RGB − Ini adalah ruang warna aditif. Nilai warna diperoleh dengan kombinasi nilai warna merah, hijau, dan biru. Masing-masing diwakili oleh angka yang berkisar antara 0 hingga 255.
  • Ruang warna HSV − H, S, dan V adalah singkatan dari Hue (corak), Saturation (saturasi), dan Value (nilai). Ini adalah model warna alternatif untuk RGB. Model ini dianggap lebih mendekati cara mata manusia melihat warna. Nilai Hue berkisar antara 0 hingga 179, sedangkan angka S dan V berkisar antara 0 hingga 255.
  • Ruang warna CMYK − Berbeda dengan RGB, CMYK adalah model warna subtraktif. Huruf-huruf tersebut mewakili Cyan, Magenta, Yellow (kuning), dan Black (hitam). Cahaya putih dikurangi merah meninggalkan cyan, hijau dikurangi dari putih meninggalkan magenta, dan putih dikurangi biru menghasilkan kuning. Semua nilai diwakili dalam skala 0 hingga 100%.
  • Ruang warna CIELAB − Ruang warna LAB memiliki tiga komponen yaitu L untuk kecerahan, komponen warna A berkisar dari hijau ke magenta, dan komponen B berkisar dari biru ke kuning.
  • Ruang warna YCrCb − Di sini, Cr berarti R-Y dan Cb berarti B-Y. Ini membantu dalam pemisahan luminansi dari krominansi ke dalam saluran yang berbeda.

Berikut function yang bisa digunakan pada opencv

Sr.No. Conversion Code & Function
1 cv.COLOR_BGR2BGRA

Add alpha channel to RGB or BGR image.

2 cv.COLOR_BGRA2BGR

Remove alpha channel from RGB or BGR image.

3 cv.COLOR_BGR2GRAY

Convert between RGB/BGR and grayscale.

4 cv.COLOR_BGR2YCrCb

Convert RGB/BGR to luma-chroma

5 cv.COLOR_BGR2HSV

Convert RGB/BGR to HSV

6 cv.COLOR_BGR2Lab

Convert RGB/BGR to CIE Lab

7 cv.COLOR_HSV2BGR

Backward conversions HSV to RGB/BGR

Secara default OpenCV menggunakan format warna BGR ketika membaca file gambar! Kalian bisa membaca link https://www.tutorialspoint.com/opencv_python/opencv_python_color_spaces.htm

Mari kita lihat perbedaan dari gambar berikut dengan variasi luminasinya ref https://learnopencv.com/color-spaces-in-opencv-cpp-python/

Format BGR/RGB

Mulai dari format warna standar yaitu RGB/BGR akan bila kita split per channel akan menghasilkan tampilan sebagai berikut

 

format warna LAB

Ruang warna Lab memiliki tiga komponen.

L – Kecerahan (Intensitas).
a – komponen warna yang berkisar dari Hijau ke Magenta.
b – komponen warna yang berkisar dari Biru ke Kuning.
Ruang warna Lab cukup berbeda dari ruang warna RGB. Dalam ruang warna RGB, informasi warna dipisahkan menjadi tiga saluran tetapi ketiga saluran tersebut juga mengodekan informasi kecerahan. Di sisi lain, dalam ruang warna Lab, saluran L independen dari informasi warna dan hanya mengodekan kecerahan. Dua saluran lainnya mengodekan warna.

Ruang warna Lab memiliki sifat-sifat berikut:

1. Ruang warna yang seragam secara perseptual yang mendekati cara kita melihat warna.
2. Independen dari perangkat (penangkapan atau penampilan).
3. Digunakan secara luas di Adobe Photoshop.
4. Berhubungan dengan ruang warna RGB melalui persamaan transformasi yang kompleks.

melalui gambar diatas dapat disimpulkan

  • Dari gambar tersebut terlihat jelas bahwa perubahan pencahayaan sebagian besar memengaruhi komponen L.
  • Komponen A dan B yang mengandung informasi warna tidak mengalami perubahan besar.
  • Nilai-nilai hijau, oranye, dan merah (yang merupakan nilai ekstrem dari komponen A) tidak berubah pada komponen B, dan demikian pula nilai-nilai biru dan kuning (yang merupakan nilai ekstrem dari komponen B) tidak berubah pada komponen A.

Ruang Warna YCrCb

Ruang warna YCrCb berasal dari ruang warna RGB dan memiliki tiga komponen berikut:

Y – Komponen luminansi atau luma yang diperoleh dari RGB setelah koreksi gamma.
Cr = R – Y (seberapa jauh komponen merah dari luma).
Cb = B – Y (seberapa jauh komponen biru dari luma).
Ruang warna ini memiliki sifat-sifat berikut:

1. Memisahkan komponen luminansi dan krominansi ke dalam saluran yang berbeda.
2. Sebagian besar digunakan dalam kompresi (komponen Cr dan Cb) untuk transmisi TV.
3. Bergantung pada perangkat.

 

Ruang Warna HSV

Ruang warna HSV memiliki tiga komponen berikut:

H – Hue (Panjang Gelombang Dominan).
S – Saturation (Kejenuhan / kemurnian warna).
V – Value (Intensitas).
Mari kita uraikan beberapa sifatnya:

1. Hal terbaik adalah hanya menggunakan satu saluran untuk mendeskripsikan warna (H), membuatnya sangat intuitif untuk menentukan warna.
2. Bergantung pada perangkat.

Melihat Nilai warna

Kalian bisa menggunakan opencv pada function diatas untuk mengubah nilai pixel

Mari kita buat

import numpy as np
import cv2
BGR = np.zeros([1,1,3])
BGR[0,0,0] = 40
BGR[0,0,1] = 158
BGR[0,0,2] = 16

gunakan perintah berikut dan hasilnya

cv2.cvtColor(np.uint8(BGR),cv2.COLOR_BGR2HSV)
Out[31]: array([[[ 65, 229, 158]]], dtype=uint8)

cv2.cvtColor(np.uint8(BGR),cv2.COLOR_BGR2YCrCb)
Out[33]: array([[[102,  67,  93]]], dtype=uint8)

cv2.cvtColor(np.uint8(BGR),cv2.COLOR_BGR2Lab)
Out[34]: array([[[145,  71, 177]]], dtype=uint8)

 

Lebih lanjut Memahami Ruang Warna LAB:

Ruang warna LAB adalah model tiga dimensi yang mencakup Kecerahan (L) dan dua dimensi lawan warna: Hijau-Merah (A) dan Biru-Kuning (B). Berbeda dengan RGB, yang bergantung pada perangkat dan kurang seragam secara perseptual, LAB dirancang untuk mendekati penglihatan manusia lebih baik.

  • L (Kecerahan):  Mewakili kecerahan yang terlihat dari hitam ke putih.
  • Saluran A dan B:  Mewakili informasi warna, dengan sumbu A berkisar dari hijau ke merah, dan sumbu B dari biru ke kuning.

Perbedaan dari RGB dan HSV:

  • RGB:  Model ini didasarkan pada intensitas komponen merah, hijau, dan biru. Namun, RGB tidak berhubungan baik dengan persepsi manusia dan sensitif terhadap perubahan kondisi pencahayaan. LAB, dengan keseragaman perseptualnya, menawarkan representasi warna yang lebih akurat.
  • HSV: Sementara HSV mewakili warna berdasarkan corak, saturasi, dan nilai, ia tidak memiliki keseragaman perseptual. Pemisahan warna LAB dari kecerahan membuatnya lebih cocok untuk tugas yang membutuhkan analisis dan manipulasi warna yang tepat.

Keuntungan Ruang Warna LAB:

  1. Keseragaman Perceptueel: Ruang warna LAB meniru persepsi manusia, memastikan bahwa jarak yang sama dalam ruang warna sesuai dengan perbedaan perseptual yang serupa. Sifat ini sangat berharga dalam aplikasi di mana representasi warna yang akurat sangat penting.
  2. Pemisahan Warna yang Ditingkatkan: LAB memisahkan informasi warna dari kecerahan, memfasilitasi analisis dan manipulasi warna yang lebih kuat. Ini memungkinkan tugas seperti segmentasi warna dan deteksi objek dilakukan dengan akurasi lebih tinggi.
  3. Independensi Perangkat: Berbeda dengan RGB, yang bergantung pada perangkat, ruang warna LAB independen terhadap perangkat. Ini berarti warna diwakili secara konsisten di berbagai perangkat dan kondisi pencahayaan, menjadikannya ideal untuk aplikasi yang membutuhkan representasi warna yang seragam.

Aplikasi Ruang Warna LAB:

  1. Segmentasi Warna: LAB memfasilitasi segmentasi warna yang tepat, bahkan dalam skenario menantang dengan kondisi pencahayaan yang bervariasi atau latar belakang yang kompleks. Ini sangat berharga dalam tugas seperti segmentasi gambar dan pelacakan objek.
  2. Peningkatan Gambar: LAB digunakan untuk berbagai tugas peningkatan gambar, termasuk koreksi warna, penyesuaian keseimbangan putih, dan peningkatan kontras. Dengan memanipulasi saluran L, A, dan B secara individual, efek yang diinginkan dapat dicapai sambil mempertahankan detail gambar.
  3. Deteksi Object: LAB membantu membedakan objek berdasarkan tanda warna mereka, membuatnya berguna dalam aplikasi industri seperti kontrol kualitas dan robotika. Ini memungkinkan deteksi objek berwarna spesifik terhadap latar belakang yang berantakan dengan akurasi tinggi.
  4. Deteksi Kulit: Dalam aplikasi yang membutuhkan deteksi kulit, seperti biometrik dan pencitraan kesehatan, ruang warna LAB digunakan untuk mengisolasi nada kulit dari sisa gambar. Ini memungkinkan tugas seperti deteksi dan pengenalan wajah dilakukan secara efektif.

Studi Kasus Dunia Nyata:

1. Studi Kasus 1: Pencitraan Medis
Ruang warna LAB sangat penting dalam segmentasi jaringan dari gambar medis seperti sinar-X dan MRI. Segmentasi yang akurat memfasilitasi diagnosis dan analisis yang tepat, menghasilkan hasil pasien yang lebih baik.

2. Studi Kasus 2: Industri Otomotif
Dalam manufaktur otomotif, ruang warna LAB digunakan untuk mendeteksi cacat atau variasi warna pada bagian kendaraan. Ini memastikan kualitas dan konsistensi produk akhir, berkontribusi pada kepuasan pelanggan dan reputasi merek.

3. Studi Kasus 3: Restorasi Seni
Untuk proyek restorasi seni, ruang warna LAB digunakan untuk meningkatkan kesetiaan warna, mengoreksi warna, dan memulihkan detail pada karya seni yang memudar. Dengan mempertahankan integritas karya seni asli, LAB memfasilitasi pelestarian warisan budaya untuk generasi mendatang.

ref: https://medium.com/@alakhsharmacs/mastering-opencv-lab-color-space-understanding-advantages-and-real-world-applications-ce1bc193a328

Untuk mengubah RGB/BGR ke Lab menggunakan persamaan matematika ref: https://medium.com/@alakhsharmacs/rgb-to-lab-color-space-conversion-formulas-insights-and-applications-7fd6efa519dd

Antara OpenCV, Pillow dan Skimage mana digunakan?

Kita lihat antara ketiga library diatas

 import cv2
import numpy as np

from PIL import Image,ImageCms
from matplotlib import pyplot as plt
from skimage import color, io


file = "/Users/user/Desktop/image.jpeg"

bgr_cv = cv2.imread(file)
rgb_cv = cv2.cvtColor(bgr_cv,cv2.COLOR_BGR2RGB)
lab_cv = cv2.cvtColor(bgr_cv,cv2.COLOR_BGR2Lab)


# https://stackoverflow.com/questions/52767317/how-to-convert-rgb-image-pixels-to-lab

rgb_pil = Image.open(file).convert('RGB')
srgb_profile = ImageCms.createProfile("sRGB")
lab_profile  = ImageCms.createProfile("LAB")

rgb2lab_transform = ImageCms.buildTransformFromOpenProfiles(srgb_profile, lab_profile, "RGB", "LAB")
lab_pil = ImageCms.applyTransform(rgb_pil, rgb2lab_transform)


# Open image and make Numpy arrays 'rgb' and 'Lab'
rgb_skim = io.imread(file)
lab_skim = color.rgb2lab(rgb_skim)


plt.figure()
plt.subplot(3,2,1),plt.imshow(rgb_cv),plt.title("openCV: RGB"),plt.axis('off')
plt.subplot(3,2,2),plt.imshow(lab_cv),plt.title("OpenCV: Lab"),plt.axis('off')


plt.subplot(3,2,3),plt.imshow(rgb_pil),plt.title("Pillow: RGB"),plt.axis('off')
plt.subplot(3,2,4),plt.imshow(lab_pil),plt.title("Pillow: Lab"),plt.axis('off')

plt.subplot(3,2,5),plt.imshow(rgb_skim),plt.title("Skimage: RGB"),plt.axis('off')
plt.subplot(3,2,6),plt.imshow(lab_skim),plt.title("Skimage: Lab"),plt.axis('off')
plt.show()

ternyata beda2 ya hasilnya

ref: https://github.com/Coloriser/RGBtoLAB/blob/master/rgbtolab.py

https://stackoverflow.com/questions/52767317/how-to-convert-rgb-image-pixels-to-lab

Lebih lanjut mengenai Lab

Bisa baca https://www.colourphil.co.uk/lab_lch_colour_space.shtml dengan nilai rentang

nilai untuk masing-masing yaitu

  • L yaitu 0 sampai 100 dari hitam putih (gelap ke terang)
  • a yaitu -128 sampai +128 dari hijau ke merah
  • b yaitu -128 sampai +128 dari biru ke kuning

 

Bila mengacu nilai diatas maka library skimage yang bisa digunakan

lab_skim = color.rgb2lab(rgb_skim)

Kalian bisa cek nilai maksimal dan minimal untuk masing2 layer diatas sudah ketentuan. Mari kita cek

layers = ['L','a','b']
for i,layer in enumerate(layers):
    print(layer,"max: ",lab_skim[:,:,i].max()," min: ",lab_skim[:,:,i].min())

hasilnya

L max:  100.0             min:  0.05830875157287707
a max:  71.6220736259619  min:  -57.50335593668182
b max:  74.83003237716368 min:  -68.26960007180458

Sedangkan yang Opencv dan Pillow masih dengan skala 0 sampai 255 alias uint8. Kita buktikan untuk yang OpenCV

layers = ['L','a','b']
for i,layer in enumerate(layers):
    print(layer,"max: ",lab_cv[:,:,i].max()," min: ",lab_cv[:,:,i].min())

hasilnya masih menggunakan nilai uint8

L max:  255  min:  0
a max:  199  min:  71
b max:  203  min:  60

 

Sedangkan untuk Pillow yaitu

layers = ['L','a','b']
for i,layer in enumerate(layers):    
    print(layer,"max: ",np.array(lab_pil.split()[i]).max()," min: ",np.array(lab_pil.split()[i]).min())

dengan hasil sama kayak OpenCV beda tipis karena pembulatan saja

L max:  255  min:  0
a max:  200  min:  75
b max:  202  min:  58

jadi dari sini bisa kita simpulkan bahwa untuk Skimage lebih cocok digunakan!

Untuk rumus yang digunakan, mungkin bisa mengacu https://softscients.com/2023/12/04/pemahaman-konversi-warna-dari-rgb-ke-lab/ (ini lupa apakah sama hasilnya dengan Opencv/Pillow atau skimage) karena menggunakan matlab

Calculator Lab

Mari kita gunakan calculator Lab http://colormine.org/convert/rgb-to-lab untuk nilai RGB [40, 158, 16] yaitu

untuk skimage harus dinormalisasi dulu

RGB = np.zeros([1,1,3])
RGB[0,0,0] = 40/255
RGB[0,0,1] = 158/255
RGB[0,0,2] = 16/255

lab_skim2 = color.rgb2lab(RGB)

hasilnya

array([[[ 57.01790261, -55.83635188,  56.19206135]]])

atau kalian bisa menggunakan colormath https://python-colormath.readthedocs.io/en/latest/conversions.html

from colormath.color_objects import XYZColor, sRGBColor, LabColor
from colormath.color_conversions import convert_color

rgb = sRGBColor(40/255,158/255,16/255)
xyz = convert_color(rgb, LabColor)

hasilnya

LabColor(lab_l=57.017813208360465,lab_a=-55.83645367897261,lab_b=56.19135750258385)

 

Pilih mana antara RGB, HSV, Lab untuk model pelatihan deep learning?

Untuk saat ini RGB lah yang paling bagus untuk dataset CIFAR, kalian bisa baca artikel berikut https://towardsdatascience.com/understand-and-visualize-color-spaces-to-improve-your-machine-learning-and-deep-learning-models-4ece80108526

Saya kira untuk colorspace harus diuji lebih lanjut karena sangat tergantung pada model dan dataset yang digunakan pada riset ColorNet: Investigating the importance of color spaces for image classification

 

See also  Belajar OpenCV di Java Bagian 2