如何在MATLAB中保存更改后的图像?

matlab file-io image-manipulation

54956 观看

8回复

4795 作者的声誉

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

另外,我只是在学习MATLAB,请保持柔和。看起来应该很简单,但是我似乎做不到。

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

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

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

作者: jacobko 的来源 发布者: 2009 年 2 月 22 日

回应 (8)


3

11449 作者的声誉

如果要保存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;
 ....
作者: LiorH 发布者: 22.02.2009 07:23

19

120331 作者的声誉

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

通常,读入MATLAB的图像会以N×M×3矩阵的形式加载(即,每个像素具有RGB(红绿蓝)值的N×M像素图像)。通常,图像数据是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中的更多信息(即truecolor索引索引),请查看文档中的imread

作者: gnovice 发布者: 22.02.2009 07:23

2

7411 作者的声誉

您也许可以用来getframe从图形窗口中获取修改后的图像。我想你可以通过传递返回结构的CDATA和颜色表的字段getframeimwrite作为图像和颜色表,分别。

作者: SCFrench 发布者: 22.02.2009 08:01

10

4795 作者的声誉

决定

The 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参数,直到看起来正确为止,然后瞧瞧!

作者: jacobko 发布者: 22.02.2009 09:55

7

6655 作者的声誉

跟进 雅各布科的回答。设置图形的paperpositionpaperunits属性以及轴单位position属性通常可以在不调整分辨率的情况下获得所需的结果。所以,

>> 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.5dpi x 2.5cm的分辨率重新绘制,分辨率为80dpi,而轴周围没有边框。

作者: Azim 发布者: 23.02.2009 05:33

1

0 作者的声誉

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);
作者: laks 发布者: 29.05.2009 10:40

13

131 作者的声誉

对于顶部的问题,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');

并继续使用它:)

此致劳拉

作者: Laura 发布者: 06.11.2012 01:48

2

21 作者的声誉

[f,p] = uigetfile('*.*');
I = imread([p,f]);
imwrite(I,'img12.tif');%

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

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

作者: Som 发布者: 30.08.2016 11:41
32x32