【问题标题】:How to convert rgb pixel colors to 8 extreme rgb colors efficiently in Matlab如何在 Matlab 中有效地将 rgb 像素颜色转换为 8 种极端 rgb 颜色
【发布时间】:2018-03-19 10:01:12
【问题描述】:

图像中的每个像素都有一个类似于 [r g b] 的 rgb 值,其中 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] 洋红色

[255 255 0] 黄色

[255 255 255] 白色。

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

【问题讨论】:

  • 您能告诉一个转换规则吗?即我有 [120, 80, 200] 像素,它应该映射到哪个极端?
  • @Gryphon 应该做简单的减法 - 将选择差异最小的那个
  • 你试过rgb2ind吗?
  • @Gryphon,它取决于阈值,如果 r_threshold = g_threshold = b_threshold = 128,那么它将是 [0 0 255]
  • 为什么不在问题里写呢? rgb2ind 或 LUT 都可以,但您应该自己准备地图或表格以供查找

标签: matlab colors


【解决方案1】:

如果您实际上想要将每个像素颜色分配给人类所说的最接近当前像素的 8 种颜色,您应该计算每个像素中的颜色与 8 种颜色中的每一种之间的 L2 距离一个感知均匀的色彩空间,如 Lab*。最小的距离将是指定的颜色。在 RGB 空间中计算距离并不对应于人类所说的“最接近的颜色”。

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

您可以使用 MATLAB 函数 pdist2 来实现。

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

【讨论】:

    【解决方案2】:

    一种快速的方法是对每个通道设置阈值,将其转换为 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2012-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多