在matlab中裁剪图像

时间:2016-07-31 18:51:44

标签: image matlab fft

我需要在matlab中为图像执行以下操作:

  1. 加载图片。
  2. 计算图像的FFT(快速傅里叶变换)。
  3. 将频率成分转移到中心。
  4. 裁剪图像如下(如果图像res为1000x1000,图像的所需部分如下图所示:100,100,800,800。这是一个较小的图像。(应用滤镜去除高频的想法)。< / LI>
  5. 反向移位。
  6. 逆傅里叶变换。
  7. 。 。

    我的代码如下:

    I = imread('2.jpg'); %loading
    
    ID = im2double(I);
    FID = fft2(ID); %FFT
    F = fftshift(FID); %shifting
    
    F = imcrop(F,[100, 100, 800, 800]);
    
    FID = ifftshift(F); %inverse of shifting
    IFID = ifft2(FID); %inverse of FFT
    
    I8 = im2uint8(IFID);
    

    问题是,当我想裁剪图像时,imcrop功能无法裁剪“复杂双重”类型的图像,正如我想的那样..

    错误:

      

    使用imcrop&gt; checkCData时出错(第410行)   输入图像无效。

         

    imcrop&gt; parseInputs出错(第256行)               checkCData(一);

         

    imcrop出错(第93行)   [x,y,a,cm,spatial_rect,h_image,placement_cancelled] = parseInputs(varargin {:});

    有任何帮助吗? ..还有另一种裁剪功能吗?

2 个答案:

答案 0 :(得分:1)

问题确实是张量F中的复杂值。证据是将imcrop(F,[100, 100, 800, 800])替换为imcrop(abs(F),[100, 100, 800, 800])

我的建议是在幅度和相位部分分解信号F并在这两个图像上使用imcrop,然后进行重建。至于理解&#39; imcrop&#39;这应该产生相同的结果。

代码看起来像:

I = imread('PersonalPhoto.JPG'); %loading

ID = im2double(I);
FID = fft2(ID); %FFT
F = fftshift(FID); %shifting

Fabs = imcrop(abs(F),[100, 100, 800, 800]);
Fang = imcrop(angle(F),[100, 100, 800, 800]);

F = Fabs.*exp(1j.*Fang);

FID = ifftshift(F); %inverse of shifting
IFID = ifft2(FID); %inverse of FFT

I8 = im2uint8(IFID);

答案 1 :(得分:1)

裁剪图像的实值分解(幅度和相位,或实部和虚部)将避免imcrop报告的错误。

但是,由于您表示您的目的是过滤高频成分,因此您应该注意裁剪也会产生减少生成的时域图像的副作用。

要保留图像大小,您可以考虑将这些频率区域归零(使用更精细的滤波器设计)。您可以通过将频域数据与作为要保留的频率分量的掩码的矩阵相乘来实现此目的。

实现此目的的代码如下:

% create a mask to zero-out high frequency components
H = zeros(size(I));
halfwidth = 400;
xmin = size(H,2)/2+1 - halfwidth;
xmax = size(H,2)/2+1 + halfwidth;
ymin = size(H,1)/2+1 - halfwidth;
ymax = size(H,1)/2+1 + halfwidth;
H(xmin:xmax, ymin:ymax, :) = 1;

% apply mask
F = F.*H;

这将为您提供以下整体代码:

I = imread('2.jpg'); %loading

ID = im2double(I);
FID = fft2(ID); %FFT
F = fftshift(FID); %shifting

% create a mask to zero-out high frequency components
H = zeros(size(I));
halfwidth = 400;
xmin = size(H,2)/2+1 - halfwidth;
xmax = size(H,2)/2+1 + halfwidth;
ymin = size(H,1)/2+1 - halfwidth;
ymax = size(H,1)/2+1 + halfwidth;
H(xmin:xmax, ymin:ymax, :) = 1;

% apply mask
F = F.*H;

FID = ifftshift(F); %inverse of shifting
IFID = real(ifft2(FID)); %inverse of FFT

I8 = im2uint8(IFID);