簡體   English   中英

圖像J 16位帶符號緩沖的圖像

[英]Image J 16 bit Signed Buffered Image

所以我的問題是如何從ij.ImagePlus中獲取16位bufferedImage ...? 如果要使用ShortProcessor,請將我的簽名圖像更改為未簽名,這樣我就不會得到原始圖像...在此先感謝任何人提供解決方案。

在此處輸入圖片說明

ImageJ如何在他們的查看器中顯示16位帶符號的圖像..而我們僅獲得8位的bufferedImage或16位無符號的bufferedImage。那么,我如何獲得16位帶符號的BufferedImage ..?

ImageJ可以使用特殊的Calibration功能來表示帶符號的16位類型。 isSigned16Bit()方法指示何時使用特定的校准功能,它是線性m * x + b校准,其中m = 1和b = -32768; 這可以在ImageJ源代碼中看到

ImageJ提供了一種通過getImage()方法從ImagePlus獲取BufferedImage的方法。 但是,這總是返回一個8位的BufferedImage

因此,下一種方法是使用DataBuffer.TYPE_SHORT類型創建自己的BufferedImage ,該BufferedImage包裝與支持原始ImagePlus對象相同的short[]數組。 不幸的是,由於ImageJ內部對帶符號的16位數據進行表示,因此這些值將偏移32768的恆定偏移量-例如,原始值-444將作為32324存儲在ImageJ的short[]數組中。 ,您必須先手動調整所有值,然后再包裝為BufferedImage

這是一些示例代碼:

import io.scif.gui.AWTImageTools;
...

final ImagePlus imp =
    IJ.openImage("http://imagej.net/images/ct.dcm.zip");

// get pixels array reference
final short[] pix = (short[]) imp.getProcessor().getPixels();
final int w = imp.getWidth();
final int h = imp.getHeight();
final boolean signed = imp.getCalibration().isSigned16Bit();

if (signed) {
    // adjust raw pixel values
    for (int i=0; i<pix.length; i++) {
        pix[i] -= 32768;
    }
}

// convert to BufferedImage
final BufferedImage image = AWTImageTools.makeImage(pix, w, h, signed);

為了將short[]實際轉換為BufferedImage ,此代碼利用了SCIFIO庫的AWTImageTools.makeImage實用程序方法。 SCIFIO包含在ImageJ斐濟發行版中 另外,只有幾行代碼可以很容易地從相關例程中復制和粘貼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM