Transformasi Gambar Buta Warna

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.

firetruck

flowers

Semoga berguna. Salam