【转】关于DCMTK中像素存储以及getoutdata()函数的使用
轉自:https://blog.csdn.net/ancewer/article/details/73277895?有刪改
當你看這個帖子的時候,假設你也因為這個問題而感到困惑。
??在使用這個函數的時候糾結了很久,各種google、百度都沒查到相關資料,測試了好多次,并計算了許多二進制像素值,才終于搞明白,getoutdata()里的參數到底應該怎么寫;
??首先我們需要弄清楚dicom文件中單個像素值是怎么存的,說下一般的情況,以16位二進制方式存儲為例,分析需要通過pixel模塊的,bitstored, bitsallocated, highbit, pixel representation這四個值。
- pixel representation
pixel representation的值有0和1兩種,0代表無符號,1代表有符號,比如二進制1001如果是無符號存儲,表示9,如果是有符號(第一位代表符號位)的話就是-1;二進制0001不管是有符號還是無符號都代表1。 - bitsallocated
bitsallocated表示用多少位來儲存,通俗來說就是開辟多少空間來存一個像素值,bitsallocated的存在是為了湊整,8或16或32,方便二進制計算. - bitstored
在CT中一般bitsallocated=16位,因為16位所占空間很大,肯定是用不完的,所以又有bitstored這個值來表示用bitsallocated中的多少位來存像素值,剩余幾位全部置0就行了。 - highbit
因為像素值可能是有符號或無符號,highbit這個值的存在是為了確定符號位(Highbit位是符號位,則有符號時有效位只有bitsstored-1位)。 
下面舉幾個例子:
- 例1:pixel representation=0, bitsallocated=16, bitsstored=12, highbit=11,假設像素值為100,按照標準存儲如下:
|0000|0000|0110|0100| - 例2:pixel representation=1, bitsallocated=16, bitsstored=12, highbit=11,假設像素值為100,按照標準存儲如下:
|0000|1000|0110|0100| - 例3:pixel representation=1, bitsallocated=16, bitsstored=16, highbit=15,假設像素值為100,按照標準存儲如下:
|1000|0000|0110|0100| 
特別注意
其實上面例2、例3都是錯的,沒看出來么?
??上面的儲存方式是我們人腦所方便理解的,但對于計算機而言,負數如果是這么存儲的話,計算機處理時候需要先做個判斷,第一位是不是1,然后再計算,這顯然對于傻瓜的只能處理0、1的計算機而言是個沉重的負擔,所以負數的存儲用了補碼(想深入理解原碼、反碼、補碼推薦博客),對于正數而言補碼還是其本身,對于負數而言補碼是撇除符號位后進行反碼運算后+1。
 所以:
- 例2的真實存儲情況是|0000|1111|1001|1100|
其實例2這種情況只是我臆想的,真是應該是不存在的,一般按照例1或例3這種比較規律的方式,當然,儲存情況是廠家訂制的,鬼知道他們會怎么干。 - 例3的真實存儲情況是|1111|1111|1001|1100|
 
考慮大端小端后
前面都是沒有考慮大小端情況,對于不同系統存儲方式有大端、小端的區別(大端、小端知識可以參考博文),所以若是大端的則不用變化,如果是小端,則結果為:
- 例1的存儲情況是|0100|0110|0000|0000|
 - 例2的存儲情況是|1100|1001|1111|0000|
 - 例3的存儲情況是|1100|1001|1111|1111|
 
關于getoutdata()
??DicomImage類中getoutdata()函數的使用與上述儲存情況息息相關,函數參數作用是取bitsstored的后面多少位,函數參數設為bitsstored的值,然后讀出的來的值為實際像素值(自己對有符號無符號進行轉換)
DicomImage *image = new DicomImage("test.dcm"); Uint16* a= (Uint16*)image->getOutputData(12); vector<Uint16> PixelData; for (int i = 0; i < 512 * 512; i++) {PixelData.push_back(*(a + i)); }總結
以上是生活随笔為你收集整理的【转】关于DCMTK中像素存储以及getoutdata()函数的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 可能是同价位续航最强的手机 iQOO Z
 - 下一篇: AITO品牌首款纯电动车 问界M5e更多