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

  • 相关阅读:
    1144 The Missing Number (20分)
    1145 Hashing
    1146 Topological Order (25分)
    1147 Heaps (30分)
    1148 Werewolf
    1149 Dangerous Goods Packaging (25分)
    TypeReference
    Supervisor安装与配置()二
    谷粒商城ES调用(十九)
    Found interface org.elasticsearch.common.bytes.BytesReference, but class was expected
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2821248.html
Copyright © 2011-2022 走看看