在 matlab 中去模糊图像 - 图像尺寸错误

De-blur an image in matlab - Error in image dimensions

我正在尝试在 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);

但是我收到以下错误

Error using ./
Matrix dimensions must agree.

Error in deblur (line 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维数组,请指教

您基本上是在尝试对彩色图像进行去模糊处理,但您所说的过程(反卷积)假设是灰度图像。您得到维度不匹配,因为执行 ./ 假设您要除以的矩阵是 相同的 维度,因为这是一个逐元素运算符。

顺便说一句,您对多通道图像使用 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 循环并将去模糊分别应用于每个通道。我还在循环之外采用了高斯模糊,因为您只需要进行一次傅立叶变换。完成后,我会显示结果。