【问题标题】:Cropping image in matlab在matlab中裁剪图像
【发布时间】:2016-12-05 20:32:03
【问题描述】:

我需要对 matlab 中的图像执行以下操作:

  1. 加载图片。
  2. 计算图像的 FFT(快速傅里叶变换)。
  3. 将频率分量移到中心。
  4. 像下面这样裁剪图像(如果图像分辨率为 1000x1000,则图像所需的部分如下坐标:100,100,800,800。这是一个较小的图像。(应用过滤器去除高频的想法)。
  5. 反向移位。
  6. 傅立叶逆变换。

。 . .

我的代码如下所示:

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 函数无法裁剪类型为“complex double”的图像,我认为..

错误:

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

imcrop 中的错误>parseInputs(第 256 行) checkCData(a);

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

ِ有什么帮助吗? .. 还有其他裁剪功能吗?

【问题讨论】:

  • 注意,在频域裁剪图像也会减小时域图像的大小。如果您只想“移除”高频分量但保持相同的图像大小,那么您可以将这些像素归零而不是直接移除它们。
  • 这是我的旧想法,但我无法应用它,你能帮帮我吗?

标签: image matlab fft


【解决方案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);

【讨论】:

  • 你的意思是:H(100:800, 100:800) = 1? ,此外,图像是每个形状不同颜色的组合,绘制在白色背景上..应用您的代码后,图像变为蓝色!这是应该的吗?
  • 索引100:800 分配给H 的一个切片。我刚刚为颜色添加了第三个维度。
  • oops 将real 部分复制到了错误的位置。最新的编辑应该解决这个问题。此外,由于该样本是 800x800 图像(而不是 1000x1000),因此您必须调整 halfwidth
  • 另外,这应该被编辑:ymax = size(H,1)/2+1 - halfwidth; to ymax = size(H,1)/2+1 + halfwidth;
【解决方案2】:

问题确实是张量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);

【讨论】:

  • Thaaaanx ,你能exp。这:F = Fabs.*exp(1j.*Fang);
  • 复数的标准表示是它的大小 Fabs 和它的角度 Fang 的组合。即复数可以写为z = a + b*j = Magn*exp(Angle*j)。 Matlab 中需要点,因为这些操作是逐元素的,而不是向量操作。
猜你喜欢
  • 1970-01-01
  • 2013-04-20
  • 2012-02-12
  • 2013-12-26
  • 2013-03-08
  • 2014-03-27
  • 2014-10-20
  • 2015-02-02
相关资源
最近更新 更多