2015-05-30 4 views
1

Я пытаюсь сделать deblurr изображение в matlab. это мой кодРазмытие изображения в matlab - Ошибка в размерах изображения

im = im2double(imread('C:\Users\adhil\Desktop\matlab pics\test.JPG')); 
figure, imshow (G1); 
% FFT for B1 
G_1 = fftshift(G1); 
G_1 = fft2(G_1); 
G_1 = ifftshift(G_1); 

h_1 = fspecial('gaussian', [130 221] , 1.0); 
% Fourier Transform of 2D Gaussian 
H_1 = fftshift(h_1); 
H_1 = fft2(H_1); 
H_1 = ifftshift(H_1); 

% Apply the filter for Image G_1 

display(size(G_1)); 
display(size(H_1)); 
F_1a = G_1 ./ H_1; 
F_1a = ifftshift (F_1a); 
F_1a = ifft2 (F_1a); 
F_1a = fftshift (F_1a); 
figure, imshow (F_1a); 

Однако я получаю следующую ошибку

Ошибка с помощью ./
размеры матрицы должны быть согласованы.

Ошибка в deblur (строка 18)
F_1a = G_1 ./ H_1;

Я заметил, что размеры массива моего изображения

display(size(G_1)); 
ans = 130 221 3 
display(size(H_1)); 
ans = 130 221 

Однако

h_1 = fspecial('gaussian', [130 221 3] , 1.0); 

не принимает в 3 одномерный массив, пожалуйста, сообщите

ответ

0

Вы в основном пытаетесь разделить цветное изображение, но процесс, о котором вы говорите (deconvolution), принимает изображение в оттенках серого. Вы получаете несоответствие размеров, потому что ./ предполагает, что матрицы, которые вы делите, равны тем же размерам, потому что это элементный оператор.

BTW, ваш начальный код использования fftshift/ifftshift/fft2 для многоканальных изображений имеет неопределенное поведение для цветных изображений. В частности, для fftshift/ifftshift, свопинг квадрантов выполняется во всех измерениях, и это обеспечит поведение, нежелательное, когда дело касается цветных изображений. В частности, вы, вероятно, захотите сделать это для каждой цветовой плоскости отдельно, и поэтому вы хотите применить fftshift/ifftshift к каждой плоскости цвета самостоятельно.

Таким образом, один из способов одновременно решить вашу проблему и избавиться от этого неопределенного поведения - это разделить каждый канал отдельно, а затем объединить результаты. Поэтому оберните все это одним контуром for и определите пустое выходное изображение, чтобы поместить результаты каждого канала в их соответствующие положения. Кроме того, ваш код в настоящее время не будет работать. Вы определяете входное изображение как im, но вы используете переменную G1 ... которая не определена. Я собираюсь предположить, что это im на самом деле G1. Изменения, которые я сделал в код есть %// Change комментариев рассеяны по:

G1 = im2double(imread('C:\Users\adhil\Desktop\matlab pics\test.JPG')); %// Change 
figure, imshow (G1); 

h_1 = fspecial('gaussian', [130 221] , 1.0); %// Change - leave outside loop - never changes 
% Fourier Transform of 2D Gaussian 
H_1 = fftshift(h_1); 
H_1 = fft2(H_1); 
H_1 = ifftshift(H_1); 

%// Change 
F_1a = zeros(size(G1)); 

for idx = 1 : size(G1, 3) %// Change 
    % FFT for B1   
    G_1 = fftshift(G1(:,:,idx)); %// Change 
    G_1 = fft2(G_1); 
    G_1 = ifftshift(G_1); 

    % Apply the filter for Image G_1 
    %// Change 
    tmp = G_1 ./ H_1; 
    tmp = ifftshift(tmp); 
    tmp = ifft2(tmp); 
    tmp = fftshift(tmp); 
    F_1a(:,:,idx) = tmp; 
end 

figure, imshow (F_1a); 

принять к сведению, что я применяю в for петлю и применяя Deblur для каждого канала в отдельности. Я также использовал гауссовское размытие вне цикла, поскольку вам нужно только один раз преобразовать Фурье. Как только я закончил, я покажу результаты.

Смежные вопросы