MATLAB中如何将imshow后的图片保存成原始大小的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中如何将imshow后的图片保存成原始大小的?相关的知识,希望对你有一定的参考价值。

我试图保存傅里叶变换后的频谱图,具体操作如下:
I=imread('a.jpg');

X=rgb2gray(I);

figure;

imshow(X);

Y=fft2(X);

figure;

imshow(log(abs(Y)),[]);

colormap(jet);

做到这一步后我就很头疼该怎么保存了,因为原图尺寸较大,用saveas或figure窗口的另存为得到的频谱图比原图画面尺寸小了很多;加了Z=uint8(log(abs(Y)));然后再用imwrite得到的图片(BMP或JPG)虽然与原图尺寸一致但是质量很差,而且不知道怎么用imwrite储存colormap(jet); 后的彩图。求高手指点!

参考技术A 可以先产生一个新的axe(同时就设定了显示的位置),再选定此axe,显示图像

% 产生新的图像显示框
hAxe=axes('Parent',gcf,... % 设置新的axe, 将'parent' 属性设置为当前窗口gcf
'Units','pixels',... %设置单位为pixels
'Position',[30 80 605 705]); % 指定axe的位置,格式为[left bottom width height], left和bottom设定了axe的左下 %角坐标,width和height设定了窗口的宽度和高度

%选定hAxe为当前axe
axes(hAxe);

%显示图像
imshow(...)
参考技术B 可以先产生一个新的axe(同时就设定了显示的位置),再选定此axe,显示图像

% 产生新的图像显示框
hAxe=axes('Parent',gcf,... % 设置新的axe, 将'parent' 属性设置为当前窗口gcf
'Units','pixels',... %设置单位为pixels
'Position',[30 80 605 705]); % 指定axe的位置,格式为[left bottom width height], left和bottom设定了axe的左下 %角坐标,width和height设定了窗口的宽度和高度

%选定hAxe为当前axe
axes(hAxe);

%显示图像
imshow(...)
参考技术C 试一下行不行
F=getframe(gcf);
imwrite(F.cdata,'aa.png')%%%相当于截屏追问

多谢你的指点,又学到一招。不过这段代码和之前用figure窗口的“另存为”得到的图效果差不多,比方说,我的原图有3307*2480这么大,用截屏或saveas之类得到的图尽管画质没有明显差异,但由于屏幕限制只有1299*913(含白框)这么大……还是希望能得到与3307*2480的原图同样大小的结果图OTL

追答

我记得saveas的帮助文件里有图片像素大小设置这一个选项,不过saveas函数的帮助文件比较复杂,也比较多,具体的我就不清楚了,你可以找一下。

本回答被提问者采纳

matlab中图片数据类型转换uint8与double

matlab中处理图像像素点数据:

img1=double(imread(‘lenna.bmp‘));

matlab中imshow图片,要先转换成uint8:

subplot(1,2,1),imshow(uint8(img1)),title(‘original‘);
subplot(1,2,2),imshow(uint8(img2)),title(‘after‘);


 

matlab图像处理关于unit8的问题_百度知道 https://zhidao.baidu.com/question/545122188.html

 

为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像。
imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。

因此,matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,
I2=im2double(I1); %把图像I1转换成double精度类型 (假设图形矩阵范围0~255)
或者
I64=double(I8)/255; %uint转换成double
如果不转换,计算会产生溢出。


 

matlab图像类型转换以及uint8、double、im2double、im2uint8和mat2gray等说明 - Thomas会写字 - CSDN博客 https://blog.csdn.net/kakiebu/article/details/78959249

1. matlab图像保存说明

  matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,好处相比较默认matlab数据类型双精度浮点double(64位,8个字节),自然可以节省很大一部分存储空间。 
  详细来说imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。例如,彩色图像像素大小是400*300( 高 * 宽 ),则保存的数据矩阵为400*300*3,其中每个颜色通道值是处于0~255之间。 
  但是虽然matlab中读入图像的数据类型是uint8,而在图像矩阵运算的时候,使用的数据类型却是double类型。一是为了保证精度,二是因为如果不转换,在对uint8进行加减时会产生溢出,可能提示的错误为: 

Function ‘*’ is not defined for values of class ‘uint8’

  1个字节无符号整型最大只能存储数据为255,对图片的操作所以很容易溢出。

2. matlab图像类型转换

 

  matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,区别如下:

 

  1.  
    img = imread(‘./1.jpg‘); % 读入是unit8型(0~255)数据
  2.  
    I1 = im2double(img); % 把图像转换成double精度类型(0~1)
  3.  
    I2 = double(img)/255; % uint8转换成double,作用同im2double

  这里补充说明一下,im2double( )和double( )的区别。double( img)就是简单的数据类型转换,将无符号整型转换为双精度浮点型double,但是数据大小没有变化,原本数据是0~255之间,转化后还是0~255。例如原来是255,那么转换后为255.0,小数位0个数是由double数据长度决定,实际数据大小还是255,只不过这个255已经是double类型空间存储了,再增加不会发生溢出情况。而im2double(img)则不仅仅是将uint8转换到double类型,而且把数据大小从0~255映射到0~1区间。 

 

以上是关于MATLAB中如何将imshow后的图片保存成原始大小的?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中如何只把figure中的图像区域保存为图片文件

matlab如何做如下图片处理

matlab 如何将彩图转成灰度图

MATLAB中生成的图片保存后发现周围有很大的白边,怎么去掉啊

MATLAB应用实战系列(七十一)-MATLAB实战应用案例:图像处理将灰度图片变成负片&彩色图片转换成灰度图片

MATLAB应用实战系列(七十一)-MATLAB实战应用案例:图像处理将灰度图片变成负片&彩色图片转换成灰度图片