日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Matlab(将2维图片显示成3维图形)

發(fā)布時間:2024/3/13 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Matlab(将2维图片显示成3维图形) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


  

  前言

  有時候為了將一張圖片以3維的形式顯示出來,可以采用matlab的強大繪圖功能。這里的3維其中的兩維當然就是圖片的xy坐標了,第3維就是圖片中對應坐標點的像素值。例如,在c/c++編程時有可能會遇到生成了一張跟概率密度相關的圖片,現在需要將其可視化,看它到底長什么樣,這時候就需要用到這個功能。本節(jié)就簡單實現一下這個。

  開發(fā)環(huán)境: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維圖如下:

  

  從這幅圖可以發(fā)現,其實看不到什么內容,因為像素值的類型為長整型,而里面的值相對長整型最大值來說又太小了,所以看起來比較黑。

?

  mesh函數繪制后的結果如下:

  

?

  surfl函數繪制后的結果如下:

  

?

?

  實驗代碼及注釋

image = imread('source.png'); [height, width] = size(image); image1 = double(image); %求出所有像素之和 sum_num = 0; for a = 1:1:height-1for b = 1:1:width-1sum_num = sum_num+image1(a,b);%如果使用image(a,b),則有可能出現錯誤的結果end end for a = 1:1:height-1for b = 1:1:width-1image1(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(将2维图片显示成3维图形)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。