MATLAB:显示原始大小的图像

7

我们能在MATLAB中展示原始大小的图片吗?

目前,当我们展示图片时,它会自适应于窗口大小。然而,我想展示图片的原始大小。当图片比较大时,应该在图片窗口中出现滚动条。这将允许用户查看图片的原始大小。

有什么办法可以实现这个功能吗?这是否可行?

6个回答

8
我认为你正在寻找的是IMTOOL实用工具(它是图像处理工具箱的一部分)。这是一个MATLAB GUI,允许您使用水平和垂直滑块以100%的放大率查看图像的原始大小。
编辑:
上述解决方案将在新的图形窗口(IMTOOL GUI)中显示您的图像。如果您不想在新窗口中显示图像,而是想要在自己的窗口中调整其大小,则会更加困难。要调整图像的大小(我假设您已经使用IMAGE命令在一组轴上显示了图像),您将不得不调整包含图像的轴的多个轴属性。以下是您可能最终修改的属性:
  • 'Units':可以设置为'inches''centimeters''pixels'等。
  • 'Position':控制坐标轴在图形窗口中的位置,单位由'Units'属性控制。
  • 'DataAspectRatio'/'PlotBoxAspectRatio':这些控制坐标轴和周围绘图框的相对缩放。
  • 'XLim'/'YLim':坐标轴的最小值和最大值。

在获得所需大小和缩放的图像后,部分图像可能位于图形窗口区域之外。不幸的是,水平和垂直滑块将不会自动添加。您需要使用UICONTROL函数自己创建这些滑块控件。您需要编写回调函数,以便滑块控件可以将坐标轴移动到窗口中。

如果您选择走上面提到的道路,这里有一些GUI设计教程链接可能会对您有帮助:一个关于闪电匕首滑块的教程, Doug Hull的博客文章, 以及 Doug关于GUIDE基础知识的视频

1
可能需要指出的是,imtool在图像处理工具箱中。 - Richie Cotton

2

Matlab滑块存在一个问题,它只在MouseUp时触发回调而不是在MouseMove上触发,因此纯Matlab实现总会感觉奇怪。

更好的方法-使用Matlab中的Java。因此,您无需重新实现整个滚动逻辑。您可以将Java Swing GUI组件放置在Matlab窗口中,这并不难。

具体来说,您必须使用Swing JScrollPane类。使用Matlab javacomponent()函数,您可以将其放置在Matlab窗口中。

网络上有大量关于如何将图像放入滚动窗格的示例,只需浏览JScrollPane image即可。您可以使用通常的Matlab语法在Matlab中使用Java类(无需new关键字等)。


1
顺便提一下,有一种方法可以让MATLAB滑块在拖动时执行回调函数,具体请参见:In MATLAB, how can you have a callback execute while a slider is being dragged? - gnovice

1
这段代码来自MATLAB的答案论坛,它创建了一个窗口,在该窗口中以本地分辨率(100%)显示图像,并提供一个“导航”窗口,显示您在主窗口中查看的图像部分在整个图像中的位置。
% Create a scroll panel with a Magnification Box and an Overview tool.
hFig = figure('Toolbar','none',...
              'Menubar','none');
hIm = imshow('saturn.png');
hSP = imscrollpanel(hFig,hIm); % Handle to scroll panel.
set(hSP,'Units','normalized',...
        'Position',[0 .1 1 .9])

% Add a Magnification Box and an Overview tool.
hMagBox = immagbox(hFig,hIm);
pos = get(hMagBox,'Position');
set(hMagBox,'Position',[0 0 pos(3) pos(4)])
imoverview(hIm)

(论坛帖子链接)


1

有趣的是,这里还没有人提到truesize

truesize(fig) 调整显示大小,使每个图像像素覆盖一个屏幕像素。如果您没有指定一个图形,truesize 将调整当前图形的显示大小。


Truesize听起来正是人们想要的,但实际上我发现它并不起作用。这就是这个论坛帖子的全部内容,也是我发布解决方案的原因。 - MechtEngineer

1
尝试一下: figure,imshow(your_image), axis image 这会将图像轴更改为原始大小。

0

为了以原始大小(1:1)显示图像,需要注意以下3个方面:

  • 图形大小和单位。
  • 轴的大小和单位。
  • 轴数据的纵横比。

一旦所有这些都根据图像大小设置好,即使使用MATLAB的image()函数,也可以生成1:1的图像显示。

以下是示例代码:

%% Load Data

mI = imread('7572939538_04e373d8f4_z.jpg');

numRows = size(mI, 1);
numCols = size(mI, 2);


%% Setings

horMargin = 30;
verMargin = 60; %<! Title requires more


%% Display Image

vFigPos = [100, 100, numCols + (2 * horMargin), numRows + (2 * verMargin)]; %<! [Left, Bottom, Width, Height]
vAxesPos = [horMargin, verMargin, numCols, numRows];

hFigure = figure('Position', vFigPos, 'Units', 'pixels');
hAxes   = axes('Units', 'pixels', 'Position', vAxesPos);
hImageObj = image(hAxes, mI);
set(hAxes, 'DataAspectRatio', [1, 1, 1]);
set(get(hAxes, 'Title'), 'String', {['Landscape by Roman Vanur']}, ...
    'Fontsize', fontSizeTitle);
set(hAxes, 'XTick', []);
set(hAxes, 'YTick', []);

结果(基于图片 - Roman Vanur的风景):

Landscape by Roman Vanur

完整的代码在我的Stack Overflow Q1427602 Github Repository中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接