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++的风格不同,需要加以区别。

 

 

 

 

posted on 2012-12-17 09:41  tornadomeet  阅读(9843)  评论(5编辑  收藏  举报

阿萨德发斯蒂芬