获取32R的图像的直方图的一个算法
生活随笔
收集整理的這篇文章主要介紹了
获取32R的图像的直方图的一个算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
朱金燦 在求非8U類型的圖像數據的直方圖時一般采用拉伸到0到255范圍。但是這樣做的一個很大弊端是造成圖像信息丟失(因為從0到幾萬拉伸到0到255,信息丟失是肯定的)。 為了防止信息丟失,現在需要在不對圖像拉伸的情況下求取32R數據的直方圖。 毫無疑問,你不能開辟一個大數組去保存所有像素值的個數,因為一則2的32次方數值4294967296,估計編譯器不允許開辟這樣大的內存,二則32R的圖像的像素值范圍就是0到幾萬,開辟這么大的數組去保存無疑是浪費內存。那么開辟一個幾萬的數組去保存是否就是合適呢?也不合適,首先32R的圖像存在像素值是負數的情況,這樣數組下標號和像素值無法對應起來,這樣就無法將像素值和像素個數聯系起來,其次雖然32R的圖像的像素值范圍就是0到幾萬,但是在很多情況下實際的像素級只有幾百或幾千個,開辟一個幾萬的數組依然存在浪費內存的問題。 為此需要使用一個數據結構將像素值和像素個數聯系起來。開始我設想使用STL的map,以像素值為鍵,像素個數為鍵值,后來我發現和算法結合起來map顯得效率很低。 為此我設計了一個結構體: struct?GrayMap { long?PixelValue;// 像素值 long?PixelNum;// 對應該像素值的像素個數 }; 具體算法如下: 1.?????? 遍歷圖像,獲取圖像的最大值Max和最小值Min 2.?????? 開辟一個static<long>(abs(Max-Min)) 個GrayMap數組GrayMapVec 3.?????? 再次遍歷圖像,每讀取一個像素值,判斷GrayMapVec是否存在這一像素值(需要遍歷GrayMapVec數組),若存在,則將其對應元素的像素個數加1,若不存在則將其插入到GrayMapVec,同時記錄實際存在的像素級RealPixelGrade。 4.?????? 開辟一個RealPixelGrade個GrayMap的數組RealGrayMapVec,將GrayMapVec的像素個數不為0的元素插入到RealGrayMapVec(此舉是為了進一步減少不必要的內存) 若使用map作為基本數據結構,瓶頸存在于遍歷map。由此我體會到數據結構可能是這樣一種東西:你輕易不會遇到這方面的問題,就算遇到了,現成的數據結構也足以解決我們的大多數問題,比如STL、MFC的集合類。但是萬一遇到了,很可能是致命的問題,這時你不得不感嘆數據結構的重要性了。
轉載于:https://www.cnblogs.com/lanzhi/archive/2008/07/06/6471233.html
總結
以上是生活随笔為你收集整理的获取32R的图像的直方图的一个算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常见的网上邻居访问问题
- 下一篇: 汇编语言的准备知识--给初次接触汇编者