Вы в основном пытаетесь разделить цветное изображение, но процесс, о котором вы говорите (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 для каждого канала в отдельности. Я также использовал гауссовское размытие вне цикла, поскольку вам нужно только один раз преобразовать Фурье. Как только я закончил, я покажу результаты.