Pada post kali ini, kita akan menyimulasikan gambar yang kira-kira dilihat oleh mereka yang memiliki kekurangan penglihatan dalam hal membedakan warna atau buta warna dengan mengikuti metode yang diajukan oleh paper dengan judul Digital Video Colourmaps for Checking the Legibility of Display by Dichromats oleh Vienot et al. Hal ini tentunya akan berguna jika kita akan mendesain website atau papan pengumuman atau poster sehingga semua karya kita bisa dinikmati oleh semua orang.
Latar belakang
Pada retina di mata, manusia memiliki 2 jenis sel, yaitu sel batang (rod cell) dan sel kerucut (cone cell). Sel batang berguna untuk mengetahui tingkat kecerahan cahaya (brightness) dan berfungsi dengan baik ketika pencahayaan kurang seperti pada malam hari. Sedangkan sel kerucut bekerja ketika terdapat pencahayaan yang cukup dan berfungsi untuk membedakan warna. Terdapat tiga jenis sel kerucut yang masing-masing memiliki tingkat kesensitifan yang berbeda terhadap panjang gelombang warna, sel kerucut merah, hijau, dan biru. Persentase komposisinya kurang lebih 65% merah, 33% hijau, dan 2% biru.
Makhluk hidup yang memiliki 3 jenis sel kerucut dengan sensitivitas berbeda disebut trichromats. Beberapa hewan karnivora seperti anjing hanya memiliki dua jenis sel kerucut, alias dichromats. Sedangkan burung dan beberapa jenis ikan memiliki 4 jenis sel kerucut yang berbeda sehingga bisa disebut tetrachromats.
Buta warna sendiri adalah kondisi ketika manusia kekurangan satu jenis sel kerucut. Buta warna diperkirakan menimpa 8% dari populasi laki-laki di seluruh dunia. Ada dua jenis buta warna yang akan disimulasikan pada post ini, protan dan deutan. Protan terjadi karena mata hanya memiliki sel kerucut hijau dan biru sedangkan Deutan terjadi ketika mata hanya memiliki sel kerucut merah dan biru.
Implementasi
Berikut kode dalam Matlab.
function [ pim, dim ] = MakeDichromatIms( im ) %This function transform the input image into two different images how they %perceived by dichromats people (protan and deutan) im = double(im); % Normalize transform the original RGB value im1 = (im/255).^(2.2); R = im1(:, :, 1); G = im1(:, :, 2); B = im1(:, :, 3); % Protan transform pR = 0.992052*R + 0.003974; pG = 0.992052*G + 0.003974; pB = 0.992052*B + 0.003974; % Deutan transform dR = 0.957237*R + 0.0213814; dG = 0.957237*G + 0.0213814; dB = 0.957237*B + 0.0213814; % Transformation matrix from RGB to LMS M = [17.8824 43.5161 4.11935; 3.45565 27.1554 3.86714; 0.0299566 0.184309 1.46709]; % Protan projection P = [0 2.02344 -2.52581; 0 1 0; 0 0 1]; % Deutan projection D = [1 0 0; 0.494207 0 1.24827; 0 0 1]; % Precompute the transformation matrix before loop to speed things up Tp = inv(M)*P*M; Td = inv(M)*D*M; % Allocate the output image pim = zeros(size(im)); dim = zeros(size(im)); % Apply the transformation for each pixel for ii=1:size(im, 1) for jj=1:size(im, 2) protan = Tp*([pR(ii,jj) pG(ii,jj) pB(ii,jj)]'); deutan = Td*([dR(ii,jj) dG(ii,jj) dB(ii,jj)]'); pim(ii, jj, 1) = protan(1); pim(ii, jj, 2) = protan(2); pim(ii, jj, 3) = protan(3); dim(ii, jj, 1) = deutan(1); dim(ii, jj, 2) = deutan(2); dim(ii, jj, 3) = deutan(3); end end % Reverse the initial transform pim = 255*(pim.^(1/2.2)); dim = 255*(dim.^(1/2.2)); end
–Edit–
Berikut implementasi yang memanfaatkan perkalian matrix di Matlab sehingga waktu eksekusinya 10x lebih cepat dibanding kode di atas.
function [ pim, dim ] = MakeDichromatIms2( im ) %This function transform the input image into two different images how they %perceived by dichromats people (protan and deutan) faster using matrix %operation in Matlab im = double(im); % Normalize transform the original RGB value im1 = (im/255).^(2.2); R = im1(:, :, 1); G = im1(:, :, 2); B = im1(:, :, 3); % Protan transform pR = 0.992052*R + 0.003974; pG = 0.992052*G + 0.003974; pB = 0.992052*B + 0.003974; % Deutan transform dR = 0.957237*R + 0.0213814; dG = 0.957237*G + 0.0213814; dB = 0.957237*B + 0.0213814; % Transformation matrix from RGB to LMS M = [17.8824 43.5161 4.11935; 3.45565 27.1554 3.86714; 0.0299566 0.184309 1.46709]; % Protan projection P = [0 2.02344 -2.52581; 0 1 0; 0 0 1]; % Deutan projection D = [1 0 0; 0.494207 0 1.24827; 0 0 1]; % Precompute the transformation matrix before loop to speed things up Tp = inv(M)*P*M; Td = inv(M)*D*M; % Apply the transformation using matrix operation PP = Tp * [pR(:)'; pG(:)'; pB(:)']; DD = Td * [dR(:)'; dG(:)'; dB(:)']; % Reverse the initial transform PP = 255*(PP.^(1/2.2)); DD = 255*(DD.^(1/2.2)); % Reshape the computed vector back pim = zeros(size(im)); pim(:,:, 1) = reshape(PP(1, :), size(R)); pim(:,:, 2) = reshape(PP(2, :), size(G)); pim(:,:, 3) = reshape(PP(3, :), size(B)); dim = zeros(size(im)); dim(:,:, 1) = reshape(DD(1, :), size(R)); dim(:,:, 2) = reshape(DD(2, :), size(G)); dim(:,:, 3) = reshape(DD(3, :), size(B)); end
Contoh keluaran dari program.
Semoga berguna. Salam