我需要在matlab中为图像执行以下操作:
。 。
我的代码如下:
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> checkCData时出错(第410行) 输入图像无效。
imcrop> parseInputs出错(第256行) checkCData(一);
imcrop出错(第93行) [x,y,a,cm,spatial_rect,h_image,placement_cancelled] = parseInputs(varargin {:});
有任何帮助吗? ..还有另一种裁剪功能吗?
答案 0 :(得分:1)
问题确实是张量F
中的复杂值。证据是将imcrop(F,[100, 100, 800, 800])
替换为imcrop(abs(F),[100, 100, 800, 800])
。
我的建议是在幅度和相位部分分解信号F并在这两个图像上使用imcrop
,然后进行重建。至于理解' imcrop'这应该产生相同的结果。
代码看起来像:
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);