Matlab成长之路_2(将2维图片显示成3维图形)
前言
有时候为了将一张图片以3维的形式显示出来,可以采用matlab的强大绘图功能。这里的3维其中的两维当然就是图片的xy坐标了,第3维就是图片中对应坐标点的像素值。例如,在c/c++编程时有可能会遇到生成了一张跟概率密度相关的图片,现在需要将其可视化,看它到底长什么样,这时候就需要用到这个功能。本节就简单实现一下这个。
开发环境:matlab2012a
实验基础
可以使用mesh函数实现,mesh函数是用来画曲面的网格表面的。
也可以使用surfl函数来实现,surfl是用来画光滑的曲面的。
有时候在matlab编程时会出现如下错误:
即:Subscript indices must either be real positive integers or logicals.
因为matlab中的下标是从1开始的,不是从0开始的,这点和c/c++完全不同。
Matlab知识点总结:
如果对图片image取一个矩形范围的话,那么应该是先取列的范围,比如image([a b c d]),其中的a和b是列的范围,c和d是行的范围。
用meshgrid来指定x和y的坐标范围时,先指定的是行的范围,然后才是列的范围,比如说meshgrid([a:b, c:d]),其中x轴的范围是a到b,y轴范围是c到d。
实验结果
本次实验是给定一张图片,该图片中每个像素点值的类型为长整型,首先将该图片转换成每个像素值为0~1的值的图片,转换的根据是求出每个像素点值的概率大小,即转换后的图片是一张2维概率分布图。最后分别用mesh函数和surfl函数将该概率图显示出来。当然因为这些图片来自人体皮肤的CrCb分布,所以CrCb的值只在一定范围内才有,所以显示的时候只显示其中的一部分,且密度大小显示是从0到最大密度处,并不是0~1。
原始2维图如下:
从这幅图可以发现,其实看不到什么内容,因为像素值的类型为长整型,而里面的值相对长整型最大值来说又太小了,所以看起来比较黑。
mesh函数绘制后的结果如下:
surfl函数绘制后的结果如下:
实验代码及注释
image = imread('source.png'); [height, width] = size(image); image1 = double(image); %求出所有像素之和 sum_num = 0; for a = 1:1:height-1 for b = 1:1:width-1 sum_num = sum_num+image1(a,b);%如果使用image(a,b),则有可能出现错误的结果 end end for a = 1:1:height-1 for b = 1:1:width-1 image1(a,b) = image1(a,b)/sum_num; end end low1 = 115;high1 = 160;low2 = 100;high2 = 140; %采用mesh()函数绘图效果 figure; max_val = max(max(image1)) [x, y] = meshgrid(low1:high1,low2:high2); z = image1(low2:high2,low1:high1); %%注意这里的顺序,先给的是列坐标 mesh(x, y, z) axis([low1 high1 low2 high2 0 max_val]) xlabel('Cr'); ylabel('Cb'); %采用surf1()函数绘图效果 figure; low1 = 115;high1 = 160;low2 = 100;high2 = 140; max_val = max(max(image1)) [x, y] = meshgrid(low1:high1,low2:high2); z = image1(low2:high2,low1:high1); %%注意这里的顺序,先给的是列坐标 surfl(x, y, z) axis([low1 high1 low2 high2 0 max_val]) xlabel('Cr'); ylabel('Cb');
实验总结: matlab编程和c/c++的风格不同,需要加以区别。