如何在Matlab中有效地将rgb像素颜色转换为8种极端rgb颜色

时间:2017-10-07 21:34:56

标签: matlab colors

图像中的每个像素的rgb值看起来都像[r g b],其中r,g,b是0到255之间的整数值。

现在,让我们定义8个rgb颜色极值:

[0 0 0]黑色

[0 0 255]蓝色

[0 255 0]绿色

[0 255 255]青色

[255 0 0]红色

[255 0 255] magenta

[255 255 0]黄色

[255 255 255]白色。

Matlab中是否有一种有效的方法或Matlab中的一个函数可以将图像转换为具有这8种极端颜色的另一种图像,具有阈值?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;