2017-01-30 16 views
1

작은 Matlab 함수를 작성했습니다.이 이미지는 RGB로 이미지를 가져와 here의 변환 공식에 따라 HSV로 변환합니다.Matlab에서 RGB를 수동으로 HSV로 변환 할 때의 이상한 현상

문제는 색 스펙트럼에 적용 할 때 스펙트럼이 잘리지 않고 일부 값이 잘못되었습니다. 이미지를 봅니다. 비교를 쉽게하기 위해 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, 입력 데이터는 이미지 "Original spectrum"입니다. 원래 수식은 0에서 360까지의 각도로 색조를 정의합니다. matlab의 값 범위가 0에서 1까지이므로 수식을 적용하려고 시도했지만 실수를했습니다. 문제를 지적 해 주셔서 감사합니다. 해결 방법으로 올바른 코드를 추가하겠습니다. – Kajsa

답변

0

오류는 a, bc의 계산을 단순화하는 데있어 오류가있었습니다. 다음과 같이 변경하면 문제가 해결됩니다.

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