13

我想将图像读入 MATLAB,在其上绘制一个矩形,然后保存图像。

另外,我只是在学习 MATLAB——请温柔一点。看起来应该很简单,但我似乎做不到。

im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);
imwrite(im, 'image2.tif');

即使我可以看到图像上的矩形,保存的图像也不会显示矩形。如何保存图像并显示矩形?

FWIW,我已经尝试过了saveas(),但这给了我一个巨大的形象。有没有办法使用saveas()并使保存的图像具有正确的大小?

4

8 回答 8

19

矩形未显示在保存的图像中的原因是您没有修改im存储图像数据的变量。矩形只是显示在绘图图像上的绘图对象。您必须修改图像数据本身。

通常,读入 MATLAB 的图像作为 N×M×3 矩阵加载(即 N×M 像素图像,每个像素具有 RGB(红-绿-蓝)值)。通常,图像数据是 uint8 数据类型,因此 RGB 值的范围是 0 到 255。如果要更改给定像素的 RGB 值,可以执行以下操作:

im = imread('test.jpg');  % Load a jpeg image
im(1,1,1) = 255;  % Change the red value for the first pixel
im(1,1,2) = 0;    % Change the green value for the first pixel
im(1,1,3) = 0;    % Change the blue value for the first pixel
imwrite(im,'new.jpeg');  % Save modified image

有多种方法可以一次修改多个像素(即矩形区域),这需要您研究如何索引到多维数组。有关如何将不同类型的图像读入 MATLAB(即truecolorindexed)的更多详细信息,我会查看imread的文档。

于 2009-02-22T19:23:55.170 回答
13

对于顶部的问题,matlab 提供了一个非常简单的解决方案:

% you so far

im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);

% now you use "getframe" and "frame2im"

f = getframe(gca);
im = frame2im(f);

imwrite(im,'image2.tif');

当我还在图像上绘制一个矩形并尝试保存它时,这对我很有用。如果您想继续使用它,只需添加

imread('image2.tif');

并继续使用它:)

问候,劳拉

于 2012-11-06T13:48:12.580 回答
10

MathWorks 网站上实际上存在一个关于此问题的错误。太糟糕了,他们没有拼出真正的答案(因为,恕我直言,将尺子举到显示器上并不是真正的解决方案)。

使用该print命令,您必须手动更改-r参数,直到保存的图像大小与输入图像的大小匹配。该-r参数指定保存图像的 DPI。由于大多数屏幕都有不同的 DPI,因此没有一种万能的解决方案。

im = imread('image.tif');
f = figure, imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');

使用上面的代码,调整-r参数直到它看起来正确,瞧!

于 2009-02-22T21:55:53.217 回答
7

跟进 雅各布科的回答。设置图形纸张位置纸张单位属性以及轴单位位置属性通常会给我想要的结果,而无需调整分辨率。所以,

>> im = imread('image.tif');
>> f = figure, imshow(im);
>> r=rectangle('Position',[100, 100,10,10]);
>> set(r,'edgecolor','b') % change the color of the rectangle to blue
>> set(f,'units','centimeters','position',[1 1 2.5 2.5]) % set the screen size and position
>> set(f,'paperunits','centimeters','paperposition',[1 1 2.5 2.5]) % set size and position for printing
>> set(gca,'units','normalized','position',[0 0 1 1]) % make sure axis fills entire figure
>> print(f, '-r80','-dtiff','image2.tif')

输出图像 image2.tif 现在将是 2.5 厘米 x 2.5 厘米,分辨率为 80dpi,没有围绕轴的边框。

于 2009-02-23T17:33:13.947 回答
3

如果要保存im,必须先修改它的值。我不熟悉矩形功能,但您可以执行以下操作(蛮力):

im = imread('image.tif');
im(100:110,100)=0;
im(100:110,110)=0;
im(100,100:110)=0;
im(110,100:110)=0;
imshow(im);
imwrite(im, 'image2.tif');

请注意,上面的代码是针对灰度图像的,如果您的图像是 RGB 图像,则需要执行以下操作:

 im(100:110,100,:)=0;
 ....
于 2009-02-22T19:23:45.453 回答
2

您也许可以使用getframe从图形窗口中获取修改后的图像。getframe我认为您可以将to返回的结构的 cdata 和 colormap 字段imwrite分别作为图像及其颜色图传递。

于 2009-02-22T20:01:19.090 回答
2
[f,p] = uigetfile('*.*');
I = imread([p,f]);
imwrite(I,'img12.tif');%

我们可以为保存图像提供的任何名称

它会自动保存在您的文件夹中,您可以浏览任何图像。

于 2016-08-30T11:41:24.937 回答
1
close all; clear; clc;

r = 240 ; c = 320;

fig = figure('Visible', 'off');
imshow( zeros(r,c) );
hold on;
plot([c-fix(c/2),c-fix(c/2)],[r-fix(r/2),r-fix(r/2)],'r*', 'MarkerSize', 10 );

% Sets position and size of figure on the screen
set(fig, 'Units', 'pixels', 'position', [100 100 c r] ); 

% Sets axes to fill the figure space
set(gca, 'Units', 'pixels', 'position', [0 0 c+1 r+1 ]);

% Sets print properties; Looks like 1 pixel = (3/4)th of a point
set(fig, 'paperunits', 'points', 'papersize', [fix((c-1)*(3/4))+1 fix((r-1)*(3/4))+1]);
set(fig, 'paperunits', 'normalized', 'paperposition', [0 0 1 1]);

print( fig, sprintf('-r%d', ceil(72*(4/3))), '-dpng', 'image.png' ); 


im = imread( 'image.png');
figure; imshow(im);
于 2009-05-29T22:40:06.470 回答