2017-02-22 6 views
1

Matlab을 통해 이미지의 각 RGB 색상 채널의 강도를 백분율로 계산하는 방법은 무엇입니까? 다음 MATLAB 코드가 제대로 작동하지 않습니다Matlab을 통해 이미지의 각 RGB 색상 채널의 강도를 백분율로 계산하는 방법은 무엇입니까?

I = imread('3.png'); % read image 

Ir=I(:,:,1); % read red chanel 
Ig=I(:,:,2); % read green chanel 
Ib=I(:,:,3); % bule chanel 

% figure, imshow(I), title('Original image') 
% figure, imshow(Ir), title('Red channel') 
% figure, imshow(Ig), title('Green channel') 
% figure, imshow(Ib), title('Blue channel') 

%% read the size of the 
m = size(I,1); 
n = size(I,2); 


R_total= 0; 
G_total= 0; 
B_total= 0; 

for i = 1:m 
      for j = 1:n 

       rVal= int64(Ir(i,j)); 
       gVal= int64(Ig(i,j)); 
       bVal= int64(Ib(i,j)); 

       R_total= R_total+rVal; 
       G_total= G_total+gVal; 
       B_total= B_total+bVal; 

      end  
end 

disp (R_total) 
disp (G_total) 
disp (B_total) 

%% Calcualte the image total intensity 
I_total = R_total + G_total + B_total; 
disp(I_total) 


%% Calculate the percentage of each Channel 

R_precentag = R_total/I_total * 100 ; %% Red Channel Precentage 
G_precentag = G_total/I_total * 100 ; %% Green Channel Precentage 
B_precentag = B_total/I_total * 100 ; 

나는 B.

어떻게 문제를 해결하기 위해 어떤 생각을 각 채널 R, G의 강도 비율을 볼 수 있을까?

답변

3

MATLAB은 나누기 후에 데이터 형식을 보존합니다. rval, gvalbval은 원래 int64으로 저장되므로이 단위 유형은 R_total, G_total, B_totalI_total으로 전파됩니다. 이러한 값을 나누어서 백분율을 찾으려고하면 먼저 나누기 연산이 수행됩니다 (MATLAB은 연산이 곱셈 및 나눗셈과 같은 우선 순위를 가질 때 왼쪽에서 오른쪽으로 작동합니다). 이 부서의 결과는 int64 단위 유형을 유지합니다. 개별 색상 채널 합계가 전체보다 작기 때문에 결과는 0과 1 사이의 값입니다. 정수가 부동 소수점 숫자를 저장할 수 없으므로 결과는 0 또는 1로 반올림됩니다. 로 시작하는 더블로 rval, bvalgval 변수를

R_precentag = double(R_total)/double(I_total) * 100; 

또는 다른 저장 : 먼저 올바르게 비율을 찾기 위해이 숫자를 분할과 같은 이중 단위 유형으로 변환하기 위해

.

MATLAB의 행렬 벡터화 (행의 끝에있는 (:)의 추가는 행을 스태킹하여 행렬을 벡터로 변환 함) 및 내장 함수와 같은 내장 함수를 활용하여 코드를 크게 향상시킬 수 있습니다 sum. 보너스로 sum은 기본적으로 결과를 두 배로 누적하여 각 값을 수동으로 변환하지 않아도됩니다.

간단한 코드는 다음과 같이 보일 수 있습니다.

I = imread('3.png'); % read image 

Ir=I(:,:,1); % read red channel 
Ig=I(:,:,2); % read green channel 
Ib=I(:,:,3); % read blue channel 

R_total= 0; 
G_total= 0; 
B_total= 0; 

R_total = sum(Ir(:)); 
G_total = sum(Ig(:)); 
B_total = sum(Ib(:)); 

disp (R_total) 
disp (G_total) 
disp (B_total) 

%% Calculate the image total intensity 
I_total = R_total + G_total + B_total; 
disp(I_total) 


%% Calculate the percentage of each Channel 
R_precentag = R_total/I_total * 100 ; %% Red Channel Percentage 
G_precentag = G_total/I_total * 100 ; %% Green Channel Percentage 
B_precentag = B_total/I_total * 100 ; 
+0

예제를 추가하여 조언을 제공해 주셨습니다. –

+0

합계를하기 전에 double로 변환하는 것을 잊지 마십시오. – gnovice

+1

@gnovice 왜 두 번 먼저 변환 하시겠습니까? 'sum'은 정수를 입력으로 사용하는 데 문제가 없으며 기본적으로 정수를 반환합니다. –