2017-01-30 6 views
1

Я написал небольшую функцию Matlab, которая принимает изображение в RGB и преобразует его в HSV в соответствии с найденными формулами преобразования here.Странное явление при преобразовании RGB в HSV вручную в Matlab

Проблема заключается в том, что когда я применяю это к спектру цветов, есть разрез в спектре, а некоторые значения неверны, см. Изображения (чтобы упростить сравнение, я использовал внутреннюю функцию hsv2rgb() для преобразования обратно в RGB. Этого не происходит с Matlabs собственной функции rgb2hsv(), но я не могу найти то, что я сделал неправильно.

Это моя функция

function [ I_HSV ] = RGB2HSV(I_RGB) 
%UNTITLED3 Summary of this function goes here 
% Detailed explanation goes here 

[MAX, ind] = max(I_RGB,[],3); 
if max(max(MAX)) > 1 
    I_r = I_RGB(:,:,1)/255; 
    I_g = I_RGB(:,:,2)/255; 
    I_b = I_RGB(:,:,3)/255; 
    MAX = max(cat(3,I_r, I_g, I_b),[],3); 
else 
    I_r = I_RGB(:,:,1); 
    I_g = I_RGB(:,:,2); 
    I_b = I_RGB(:,:,3); 
end 
MIN = min(cat(3,I_r, I_g, I_b),[],3); 
d = MAX - MIN; 

I_V = MAX; 
I_S = (MAX - MIN) ./ MAX; 
I_H = zeros(size(I_V)); 

a = 1/6*mod(((I_g - I_b) ./ d),1); 
b = 1/6*(I_b - I_r) ./ d + 1/3; 
c = 1/6*(I_r - I_g) ./ d + 2/3; 
H = cat(3, a, b, c); 

for m=1:size(H,1); 
    for n=1:size(H,2); 
     if d(m,n) == 0 
      I_H(m,n) = 0; 
     else 
      I_H(m,n) = H(m,n,ind(m,n)); 
     end 
    end 
end 

I_HSV = cat(3,I_H,I_S,I_V); 


end 

Original spectrum Оригинальный спектр Reconverted Converted spectrum Конвертированный спектр

+0

Хорошо, что вы предоставили код, но нам нужны входные данные и для репликации ваших результатов. Тем не менее, 'mod (..., 1)' при вычислении 'a' выглядит подозрительным ... – Justin

+0

@Justin, входными данными является изображение« Исходный спектр ». Исходная формула определяет оттенок в градусах от 0 до 360. Поскольку диапазон значений в matlab составляет от 0 до 1, я попытался адаптировать формулу формулы, но я допустил ошибку. Спасибо, что указали на проблему. Я добавлю правильный код в качестве решения. – Kajsa

ответ

0

Ошибка была в моем упрощении расчетов a, b и c. Изменение этой проблемы позволило решить эту проблему.

function [ I_HSV ] = RGB2HSV(I_RGB) 
%UNTITLED3 Summary of this function goes here 
% Detailed explanation goes here 

[MAX, ind] = max(I_RGB,[],3); 
if max(max(MAX)) > 1 
    I_r = I_RGB(:,:,1)/255; 
    I_g = I_RGB(:,:,2)/255; 
    I_b = I_RGB(:,:,3)/255; 
    MAX = max(cat(3,I_r, I_g, I_b),[],3); 
else 
    I_r = I_RGB(:,:,1); 
    I_g = I_RGB(:,:,2); 
    I_b = I_RGB(:,:,3); 
end 
MIN = min(cat(3,I_r, I_g, I_b),[],3); 
D = MAX - MIN; 

I_V = MAX; 
I_S = D ./ MAX; 
I_H = zeros(size(I_V)); 

a = 1/6*mod(((I_g - I_b) ./ D),6); 
b = 1/6*((I_b - I_r) ./ D + 2); 
c = 1/6*((I_r - I_g) ./ D + 4); 
H = cat(3, a, b, c); 

for m=1:size(H,1); 
    for n=1:size(H,2); 
     if D(m,n) == 0 
      I_H(m,n) = 0; 
     else 
      I_H(m,n) = H(m,n,ind(m,n)); 
     end 

     if MAX(m,n) == 0 
      S(m,n) = 0; 
     end 
    end 
end 

I_HSV = cat(3,I_H,I_S,I_V); 

end