matlab ( octave ) imwrite 保存图像详解

刚刚写了imshow, 想了想发现imwrite和imshow是完全一致的, 所以根据上篇文章简单写写imwrite用法。

上篇文章链接: http://blog.csdn.net/watkinsong/article/details/38535341

采用图像:

imwrite() 中, 如果参数为uint8类型, 那么期待的参数像素值范围为0-255, 如果参数矩阵为double类型, 那么期待的像素值范围为0-255.

在imwrite中, 如果你将读取的图像转换为double类型, 直接用imwrite保存图像, 会出现全是白色的图像的情况 , 因为在转化图像类型的时候, 图像的像素值虽然变为double数据类型, 但是取值范围仍然是0-255, imwrite处理double类型的时候期待的数据范围是0-1, 会把大于1的值当作1处理, 这样几乎所有的像素都变成了白色。

根据上一篇文章, 这里直接简单给出所有的测试代码以及保存的图像结果:

%% this file is used to show how to use imshow or imagesc and so on
% there is some different when you use imshow to display double image or uint8 image
% here all the code will process gray image, RGB color image will not suitable for this file's code
% but you can convert RGB color image to gray image if you want to exercise by this code

% img will be uint8 type
img = imread('syz.bmp');

% imshow: when the parameter img is uint8 type,
% imshow will default make the range of pixel value as [0-255]
imshow(img);
% this write correct pic
imwrite(img, 'sw1.bmp');
fprintf('Program paused. Press enter to continue.\n');
pause;

% sometimes we need to process the img by double type,
% so, you may convert the data type to double
dimg = double(img);

% but, right now you will not get the correct display,
% because if the parameter of imshow is double type, if will defaultly
% take range of [0-1], but now the range is [0-255]
% all the value over 1 is ceilled to 1. (clamped to 1)
% so, the displayed image will be a whole white picture.
imshow(dimg);
% this will write a white pic
imwrite(dimg, 'sw2.bmp')
fprintf('Program paused. Press enter to continue.\n');
pause;

% how to correctly display double typed image
% way 1: convert double to uint8
imshow(uint8(dimg));
imwrite(uint8(dimg), 'sw3.bmp')
fprintf('Program paused. Press enter to continue.\n');
pause;

% way 2: change the value of double typed image to [0-1]
maxVal = max(max(dimg));
imshow(dimg / maxVal);
imwrite(dimg / maxVal, 'sw4.bmp');
fprintf('Program paused. Press enter to continue.\n');
pause;

%% some other occurence, the image maybe in double type,
% but some normalization operation will lead to negative pixel value
% In order to display the image, we need to add a value that make
% all negative value to positive value

% here i just minus a specific value, in real application,
% a face image maybe normalized by substract mean face.
normImg = dimg - 127; % then normImg will have some negative values

minVal = min(min(normImg));
imshow(uint8(normImg - minVal));
imwrite(uint8(normImg - minVal), 'sw5.bmp');
fprintf('Program paused. Press enter to continue.\n');
pause;

%% if you want to save image by imwrite()
% if the image is double type, you need to normalize the value to [0-1]
% if the image is uint8 type, it's ok to save image directly.

保存的图像:

sw1: 因为img本身就是uint8类型, 所以保存的图像是正确的

sw2: (其实下面是一张白色图像), 将图像转换为double以后, 值还是在0-255, 但是imwrite要求是0-1, 所以这个时候超过1的像素都被当作1, 所有图像像素几乎都是白色。。。。其实下面图像可以看到一个黑色的像素点。。。

sw3: 转换像素类型后正确

sw4: 将像素值归一到0-1之间, 正确

sw5: 处理存在像素值为负数的像素值后, 正确

matlab ( octave ) imwrite 保存图像详解

时间: 2024-11-03 22:34:45

matlab ( octave ) imwrite 保存图像详解的相关文章

MATLAB图像处理_plot的使用详解

MATLAB plot函数详解 matlab中plot是最简单的一个画二维图的工具:不过其用法也是很多的,比如线性方面: plot画图的颜色线型    y         黄色           ·             点线 m         粉红           ○             圈线 c         亮蓝           ×             ×线 r         大红           +             +字线 g         绿色 

Matlab的imfilter函数用法详解

Matlab的imfilter函数用法 功能:对任意类型数组或多维图像进行滤波. 用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,...) 或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)其中,f为输入图像,w为滤波掩模,g为滤波后图像.filtering_mode用于指定在滤波过程中是使用"相关"还是"卷积".bou

详解matlab之简易2048制作

详解matlab之简易2048制作 详解matlab之简易2048制作 一制作之前 1关于初始化 2运行时出现2的位置问题 3移动方向问题 4关于数字合并 5关于游戏怎么结束 6其他还有什么就看着需要办吧 二实现过程 1关于空位置补充一个2 2关于移动后的操作 三关于具体某个方向的操作 1上操作 2下操作 3左操作 4右操作 四命令窗口模拟显示 五关于matlab的GUI实现 一):制作之前 小游戏2048出来也算很久了,基本上大家都知道,通俗易懂,玩法也很简单,前几天兴趣来了,通过matlab

openCV—Python(2)—— 载入、显示和保存图像

一.函数简单介绍 1.imread-读取图像 函数原型:imread(filename, flags=None) filename:读取的图像路径名:比如:"H:\img\lena.jpg". flags:彩色图or灰色图,1:表示彩色图.0:表示灰色图. 2.imshow-显示图像 函数原型:imshow(winname, mat) winname:窗体名字.比如:"Lena". mat:要显示的图像矩阵. 3.imwrite-保存图像 函数原型:imwrite(

matlab ( octave ) imshow显示图像详解

最近在用octave (类似于matlab的计算软件, 函数和matlab一致) 写程序的时候, 在显示图像和保存图像的时候遇到了一些小问题, 所以简单的总结了一下. 本文用的图像为灰度图像: imread() 返回的图像类型是uint8类型, 这时用imshow显示图像的时候, imshow会认为输入矩阵的范围在0-255, 如果imshow的参数为double类型的,那么imshow认为输入矩阵的值为0-1. 很多时候需要将图像转换为double类型的, 但是转换以后直接使用imshow显示

图像小波变换原理_图像小波变换的matlab实现详解

小波变换的原理 所谓的小波的小是针对傅里叶波而言,傅里叶波指的是在时域空间无穷震荡的正弦(或余弦波). 相对而言,小波指的是一种能量在时域非常集中的波,它的能量有限,都集中在某一点附近,而且积分的值为零,这说明它与傅里叶波一样是正交波. 举一些小波的例子: 可以看到,能量集中在x轴0值附近,以y轴的0值为基线,上下两个区域的波形面积相等. 众所周知,图像的傅里叶变换是将图像信号分解为各种不同频率的正弦波.同样,小波变换是将图像信号分解为由原始小波位移和缩放之后的一组小波. 小波在图像处理里被称为

Matlab imwrite函数 保存图像会压缩

Matlab 正常的 uint8*3 的变量,imwrite保存为jpg后会 压缩图像,两种解决方法. 1.'quality',100,'mode','lossless' imwrite(img_out,[imgPathOut,int2str(n),'.jpg'],'quality',100,'mode','lossless'); imwrite(imgA,[imgPathOutA,int2str(n),'.jpg'],'quality',100,'mode','lossless'); imwr

PCA (主成分分析)详解 (写给初学者) 结合matlab(转载)

一.简介 PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法,大家知道,我们在处理有关数字图像处理方面的问题时,比如经常用的图像的查询问题,在一个几万或者几百万甚至更大的数据库中查询一幅相近的图像.这时,我们通常的方法是对图像库中的图片提取响应的特征,如颜色,纹理,sift,surf,vlad等等特征,然后将其保存,建立响应的数据索引,然后对要查询的图像提取相应的特征,与数据库中的图像特征对比,找出与之最近的图片.这里,如果我们为了提

【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图像增强处理,包括图像普通平滑.高斯平滑.不同算子的图像锐化知识.希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生. [数字图像处理]一.MFC详解显示BMP格式图片 [数字图像处理]二.MFC单文档分割窗口显示图片 [数字图像处理]三.MFC实现图像灰度.采样和量化功能详解 [数字图像处理]四.MFC对话框绘制灰度直方图 [数字图像