2017-10-07 47 views
1

的圖像中的每個像素具有RGB值,看起來像[RGB],其中r,G,B是整數值從0到255如何RGB像素顏色高效地轉換成8種極的RGB顏色在Matlab

現在

,讓我們定義8 RGB顏色極端:

[0001]黑

[0 0 255]藍色

[0 255 0]綠色

[0 255 255]青色

[255 0 0]紅色

[255 0 255]品紅

[255 255 0]黃色

[255 255 255]白色。

在Matlab中有沒有一種有效的方法或Matlab中的一個函數可以將圖像轉換爲另一個具有這8種極端顏色的圖像,並具有閾值?

+0

請問您是否可以告訴規則轉換?即我有[120,80,200]像素,它應該映射到哪個極端? – Gryphon

+0

@Gryphon簡單的減法應該做的 - 最小的差異將被挑選 – frslm

+0

你試過[rgb2ind](https://www.mathworks.com/help/matlab/ref/rgb2ind.html)嗎? – rahnema1

回答

0

如果您實際上想要將每個像素的顏色分配給人類會說的8個顏色中最接近當前像素的顏色,則應計算每個像素中的顏色與8種顏色中的每一種顏色之間的L2距離在感知上均勻的色彩空間,如L a b *。最小的距離就是指定的顏色。在RGB空間計算距離並不符合人們所說的「最接近的顏色」。

https://en.wikipedia.org/wiki/Lab_color_space

你可以這樣使用MATLAB功能pdist2實現。

https://www.mathworks.com/help/stats/pdist2.html

0

一個快速的方法是將閾值的每個信道,將其轉換成0或1,然後通過255相乘:

r_threshold = 128; 
g_threshold = 117; 
b_threshold = 192; 
% im is original image 
im2(:,:,1) = (im(:,:,1) - r_threshold) > 0; % threshold red channel... 
im2(:,:,2) = (im(:,:,2) - g_threshold) > 0; % ... green channel 
im2(:,:,3) = (im(:,:,3) - b_threshold) > 0; % ... and blue channel 
im2 = im2 .* 255; % change range from [0,1] to [0,255] 

等效但略有不太明顯的方式做到的閾值(對於更新版本的MATLAB)將將閾值向量置換爲1x1x3向量並執行元素減法:

im2 = (im .- permute([r_threshold, g_threshold, b_threshold], [1 3 2])) > 0; 
im2 = im2 .* 255;