zoukankan      html  css  js  c++  java
  • 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++的风格不同,需要加以区别。

  • 相关阅读:
    nginx解决前端跨域配置
    oracle 空表处理
    (转)Oracle修改表空间为自动扩展
    使用silverlight自定义控件时“给定关键字不在字典中”
    arcengine note:
    Jquery CSS 操作
    Jquery Easy-UI 树形菜单的运用
    Easy-UI data-options总结
    数据库 存储过程初探
    ASP.NET 日志的记录(登录日志和异常日志和操作日志)
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2821248.html
Copyright © 2011-2022 走看看