当前位置: 首页 > 知识库问答 >
问题:

在matlab中裁剪图像

孟胤
2023-03-14

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

  1. 加载图像
  2. 计算图像的FFT(快速傅立叶变换)
  3. 将频率分量移到中心
  4. 像follow一样裁剪图像(如果图像分辨率为1000x1000,则图像所需的部分类似于以下坐标:100100800800。这是一个较小的图像。(应用过滤器去除高频的想法)
  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);

问题是,当我想裁剪图像时,我的功能无法裁剪类型为“复杂双”的图像,因为我认为...

错误:

使用im作物时出错

imcrop错误

输入错误(第93行)[x, y, a, cm,spatial_rect,h_image,placement_cancelled]=parseInput(varargin{:});

有帮助吗?...还有裁剪的另一个功能吗?

共有2个答案

刘玉石
2023-03-14

问题确实是张量F中的复数值。一个证明是将im作物(F,[100, 100, 800, 800])替换为im作物(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);
左丘季
2023-03-14

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

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

为了保持图像大小,您可以考虑将这些频率单元归零(不需要使用更精细的滤波器设计)。您可以通过将频域数据与一个矩阵相乘来实现这一点,该矩阵充当要保留的频率分量上的掩码。

实现这一点的代码如下所示:

% 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);
 类似资料:
  • 我试图在从图库中选择图像后使用intent来裁剪图像。以下是我的代码片段 在这里,我使用PICK_IMAGE_REQUEST意图句柄调用上面的代码段 由于我在裁剪后使用了相同的意图,即PICK_IMAGE_REQUEST,可能会出现什么问题

  • 使用 Illustrator 中的“图像裁剪”功能裁剪链接或嵌入的图像。 裁剪图像 您可以在 Illustrator 中裁剪链接或嵌入的图像。在裁剪时,您可以使用直观的构件控件处理选定的图像。“图像裁剪”功能只对当前选定的图像有效。此外,链接的图像在裁剪后会变为嵌入的图像。 注意: 裁剪掉的图像部分会被丢弃,且无法恢复。 在裁剪图像时,无法变换图像。在选择“裁剪图像”选项后,如果您尝试变换图像,则

  • 问题内容: 我想用PHP裁剪图像并保存文件。我知道您应该使用GD库,但我不确定如何使用。有任何想法吗? 谢谢 问题答案: 您可以用来裁剪图像的必需部分。该命令如下所示: 来自PHP.net的代码- 从源图像中裁剪出一个80x40像素的图像

  • 我将<code>背景 1.back_xml: 2.瓷砖.xml 现在,我将back.xml设置为< code >背景以< code>LinearLayout工作正常。 我需要有一个圆角,以及它的边框。但是我只有圆角的边框,而不是图像,我的代码中有什么问题吗? 这是我的照片:

  • 本节,我们将裁剪图像的一部分,然后把其结果绘制到画布上。 图3-2 裁剪图像 绘制步骤 按照以下步骤,裁剪图像的一部分,再把结果绘制到画布: 1. 定义画布上下文: window.onload  = function(){ var canvas  = document.getElementById("myCanvas"); var context  = canvas.getContext

  • 问题内容: 如何使用JavaFX 完成Android ? 我有图像视图: 问题答案: 感谢@TravisF的发布,我实现了最后一个解决方案,以使图像始终具有相同的高度,宽度和位置(中心)。