Matlab 中的 Lab 颜色 space 量化

Lab color space quantization in Matlab

在 Matlab 中,我已将 RGB 图像转换为 CIE Lab 颜色 space。

Lab = applycform(rgbImage, makecform('srgb2lab'));
L = Lab(:, :, 1);
a = Lab(:, :, 2);
b = Lab(:, :, 3);

如何量化和组合这 3 个通道?

...

为了比较,这是我对 RGB 所做的:

在主程序中

R = rgbImage(:, :, 1);
G = rgbImage(:, :, 2);
B = rgbImage(:, :, 3);

binsR = 4;
binsG = 4;
binsB = 4;

quantR = Quantize(binsR, R, 255);
quantG = Quantize(binsG, G, 255);
quantB = Quantize(binsB, B, 255);

quantColors = (binsB*binsG*quantR) + (binsB+quantG) + quantB;

Quantize.m

function quant = Quantize(bins, data, maxdata)

quant = data * (bins/maxdata);
quant = floor(quant);
quant(quant >= (bins - 1)) = (bins - 1);

end

原来我找到了解决办法:D

好的是:

代码比较简单!

在主程序中

labImage = applycform(rgbImage, makecform('srgb2lab'))
labImage = lab2double(labImage)
L = labImage(:, :, 1)
a = labImage(:, :, 2)
b = labImage(:, :, 3)

bins_L = 10
bins_a = 10
bins_b = 10

quant_L = QuantizeMT(bins_L, L)
quant_a = QuantizeMT(bins_a, a)
quant_b = QuantizeMT(bins_b, b)

quantColors = sqrt(quant_L.^2 + quant_a.^2 + quant_b.^2)

QuantizeMT.m

function quant = QuantizeMT(bins, data)

% Number of divider is number of segments (bins) minus 1
thresh = multithresh(data, bins-1)
% Quantize image (or channel) based on segments
quant = imquantize(data, thresh)

end

备注:

  1. 我们可以在不将 Lab 转换为 Double 的情况下继续,但某些图像可能会出错。这是因为 Lab 中的值是默认编码的。因此 multithresh 函数不会检测到一些略有不同的值,从而导致一些相同的阈值。基于 imquantize 文档:"Values of the discrete quantization levels must be in monotonically increasing order." 因此最好使用 lab2double 函数。
  2. multithreshimquantize 函数应该与任何颜色空间兼容。尽管某些 RGB 图像存在异常,但在 multithresh 步出现错误,通常在 B(蓝色)通道中。我不知道为什么。但是当我对整个图像使用 imquantize 时,我没有遇到任何问题,而不是逐个通道。
  3. 组合 3 个通道的公式称为欧氏距离。完全兼容任何颜色空间,用于纹理检测时产生比其他公式更好的结果。

PS: 我用的是Matlab R2012b.