0

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

Lab = applycform(rgbImage, makecform('srgb2lab'));
L = Lab(:, :, 1);
a = Lab(:, :, 2);
b = Lab(:, :, 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;

量化.m

function quant = Quantize(bins, data, maxdata)

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

end
4

1 回答 1

1

事实证明我找到了解决方案: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)

量化MT.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文档:“离散量化级别的值必须以单调递增的顺序排列。” 因此最好使用lab2double函数。
  2. multithreshimquantize功能应该与任何色彩空间兼容。尽管某些 RGB 图像存在异常,但multithresh步骤错误,通常在 B(蓝色)通道中。我不知道为什么。imquantize但是当我使用整个图像而不是逐个通道时,我没有问题。
  3. 组合 3 个通道的公式称为欧几里得距离。与任何色彩空间完全兼容,在纹理检测中使用时比其他公式产生更好的结果。

PS:我使用 Matlab R2012b。

于 2015-06-12T20:31:31.190 回答