
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
Contents
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:
- 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.
- 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.
- 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:
- 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.
- 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.
- 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.
- 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.
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“