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

时间:2015-05-30 05:25:08

标签: image matlab image-processing computer-vision

我正在尝试在matlab中对图像进行deblurr。这是我的代码

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 );

不接受三维数组,请告知

1 个答案:

答案 0 :(得分:0)

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

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