[英]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.