2015-05-29 5 views
0

В Matlab я преобразовал RGB image to CIE Lab Цветовое пространство.Лабораторное квантование квантового пространства в Matlab

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 

ответ

1

I т получается, что я нашел решение: 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 Удвоить, но ошибка может для некоторых изображений. Это связано с тем, что значения в Lab кодируются по умолчанию. Таким образом, некоторые незначительные значения не будут обнаружены функцией multithresh, что приведет к некоторым одинаковым значениям порога. На основании документации imquantize: «Значения уровней дискретного квантования должны быть в монотонно возрастающем порядке». Поэтому лучше использовать функцию lab2double.
  2. multithresh и imquantize функции должны быть совместимы с любыми цветовыми пространствами. Несмотря на наличие исключения для некоторых изображений RGB, ошибка на этапе multithresh, обычно в канале B (синий). Я не знаю почему. Но у меня нет проблем, когда я использую imquantize для всего изображения, а не по каналу.
  3. Формула для объединения трех каналов называется евклидовым расстоянием. Полностью совместим с любыми цветовыми пространствами и обеспечивает лучший результат, чем другие формулы при использовании в обнаружении текстуры.

PS: Я использую Matlab R2012b.