【问题标题】:De-blur an image in matlab - Error in image dimensions在matlab中去模糊图像 - 图像尺寸错误
【发布时间】:2015-05-30 19:38:37
【问题描述】:

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

但是我收到以下错误

使用./时出错
矩阵尺寸必须一致。

去模糊错误(第 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维数组,请指教

【问题讨论】:

    标签: image matlab image-processing computer-vision


    【解决方案1】:

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

    顺便说一句,您对多通道图像使用fftshift / ifftshift / fft2 的开始代码对于彩色图像具有未定义的行为。具体来说,对于fftshift/ifftshift,象限的交换是在所有维度上完成的,这将提供彩色图像时不希望出现的行为。具体来说,您可能希望分别为每个颜色平面执行此操作,因此您希望将fftshift/ifftshift 单独应用于每个颜色平面。

    因此,同时解决您的问题并摆脱这种未定义行为的一种方法是分别对每个通道进行去模糊,然后合并结果。因此,将所有这些包装在一个for 循环中,并定义一个空输出图像以将每个通道的结果放置在它们各自的位置。此外,您的代码当前不会运行。您将输入图像定义为im,但您使用的是未定义的变量G1...。我将假设这个im 实际上是G1。我对您的代码所做的更改使%// Change cmets 分散在各处:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 2012-05-24
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多