2016-11-01 60 views
2

我有一個矩陣文件,它是由拜耳過濾器更改的照片。當我使用RGGB傳感器對齊方式對其使用去馬賽克功能時,它會變成原始圖片。 我試圖通過將每個不可用像素顏色的相同顏色像素的平均值作爲它的值來實現去馬賽克功能,但是它給出的答案不是原始照片。你能告訴我我做錯了什麼嗎?在matlab中實現去馬賽克功能

clear; 
clc; 

I = struct2cell(load('Bayer.mat')); 
J = I{1,1}; 
[M N] = size(J); 
T = uint8(zeros(M,N,3)); 

for i = 2:M-1 
    for j = 2:N-1 
     if mod(i,2) ~= mod(j,2) %G 
      T(i,j,1)=round((J(i,j-1)+J(i,j+1))/2); 
      T(i,j,2)=round(J(i,j)); 
      T(i,j,3)=round((J(i-1,j)+J(i+1,j))/2); 
     elseif mod(i,2) == 1 %R 
      T(i,j,1)=round(J(i,j)); 
      T(i,j,2)=round((J(i-1,j)+J(i+1,j)+J(i,j-1)+J(i,j+1))/4); 
      T(i,j,3)=round((J(i-1,j-1)+J(i+1,j-1)+J(i+1,j-1)+J(i-1,j+1))/4); 
     else %B 
      T(i,j,1)=round((J(i-1,j-1)+J(i+1,j-1)+J(i+1,j-1)+J(i-1,j+1))/4); 
      T(i,j,2)=round((J(i-1,j)+J(i+1,j)+J(i,j-1)+J(i,j+1))/4); 
      T(i,j,3)=round(J(i,j)); 
     end 
    end 
end 
%K = demosaic(J,'rggb'); 
imwrite(J,'im0.jpg'); 
imwrite(T,'im05.jpg'); 

回答

2

您在處理綠色通道時出錯。您應該分別考慮左下角和右上角的綠色,因爲它的鄰居會針對每種情況更改。這是下面的代碼:

I = imread('lena.bmp'); 
[M,N,L] = size(I); 
J = zeros(M,N); 
R = I(:,:,1); 
G = I(:,:,2); 
B = I(:,:,3); 
J(1:2:M,1:2:N) = R(1:2:M,1:2:N); 
J(2:2:M,2:2:N) = B(2:2:M,2:2:N); 
J(J==0) = G(J==0); 
T = zeros(M,N,3); 
figure,imshow(uint8(J)); 

%% Reconstruct Bayer Filtered Image here 
for i = 2:M-1 
    for j = 2:N-1 
     if mod(i,2) == 0 && mod(j,2) == 1 %G 
      T(i,j,1)=round((J(i-1,j)+J(i+1,j))/2); 
      T(i,j,2)=round(J(i,j)); 
      T(i,j,3)=round((J(i,j-1)+J(i,j+1))/2); 
     elseif mod(i,2) == 1 && mod(j,2) == 0 
      T(i,j,1)=round((J(i,j-1)+J(i,j+1))/2); 
      T(i,j,2)=round(J(i,j)); 
      T(i,j,3)=round((J(i-1,j)+J(i+1,j))/2); 
     elseif mod(i,2) == 1 %R 
      T(i,j,1)=round(J(i,j)); 
      T(i,j,2)=round((J(i-1,j)+J(i+1,j)+J(i,j-1)+J(i,j+1))/4); 
      T(i,j,3)=round((J(i-1,j-1)+J(i+1,j-1)+J(i+1,j-1)+J(i-1,j+1))/4); 
     else %B 
      T(i,j,1)=round((J(i-1,j-1)+J(i+1,j-1)+J(i+1,j-1)+J(i-1,j+1))/4); 
      T(i,j,2)=round((J(i-1,j)+J(i+1,j)+J(i,j-1)+J(i,j+1))/4); 
      T(i,j,3)=round(J(i,j)); 
     end 
    end 
end 

另外,如果你的形象J被定義爲uint8你應該讓double,因爲當像素的總和超過255

+0

圖片我在得到uint8會溢出因爲我是一個N * M * 1的拜耳矩陣,所以我不明白你從哪裏得到了'''I(:,:2)'''和''I(:,:3)'' '從 然後我必須改變它的原始'''''K = demosaic(T,'rggb');'''會做它,但我不允許使用demosaic功能,所以我的主要問題是在N * M * 1矩陣上實現去馬賽克 –

+0

@AlalehA這裏我是原始的RGB圖像(尺寸= M×N×3),進行Bayer過濾並保存到T矩陣(M×N×1)。然後使用去馬賽克函數從T矩陣構造另一個RGB圖像K(MxNx3)。 – Bhoke

+0

糟糕,我只是認識到了這個問題。我將編輯我的帖子 – Bhoke