gpt4 book ai didi

java - Imagej 16 位有符号缓冲图像

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:24 26 4
gpt4 key购买 nike

所以我的问题是如何从 ij.ImagePlus 获取 16 位 bufferedImage...?如果我尝试使用 ShortProcessor,它将我的签名图像更改为未签名,因此我无法获得原始图像...提前致谢,任何人都可以提供解决方案。

enter image description here

ImageJ 如何在其查看器中显示 16 位签名图像..而我们只能获得 8 位 bufferedImage 或 16 位无符号 bufferedImage 那么我如何获得 16 位签名 BufferedImage..?

最佳答案

ImageJ 可以使用特殊的Calibration 函数表示带符号的 16 位类型。 isSigned16Bit() 方法指示何时使用特定校准函数 - 它是线性 m*x+b 校准,其中 m=1 且 b=-32768;这可以是seen in the ImageJ source code .

ImageJ 提供了一种通过 getImage() 方法从 ImagePlus 获取 BufferedImage 的方法。然而,这个always returns an 8-bit BufferedImage .

因此,下一个方法是创建您自己的 DataBuffer.TYPE_SHORT 类型的 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 包含在 Fiji distribution of ImageJ 中。或者,它只是几行代码,可以很容易地从相关例程中复制和粘贴。

关于java - Imagej 16 位有符号缓冲图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23266560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com