2

DICOM 文件包含一系列 CAT 扫描图像。Java中是否有一个DICOM库的实现可以读取文件并提取存储在其中的图像?我想将这些图像存储到 BufferedImage 数据类型中。

4

3 回答 3

10

您可以使用 dcm4che-3.3.X。这个神话般的框架的新重写带有完全集成的 jai-imageio 库,您无需再下载和配置它。

读取 Dicom 文件的元信息是创建一个org.dcm4che3.io.DicomInputStreamfrom dicom 文件并使用实现org.dcm4che3.io.DicomInputHandler接口的类解析流的过程。你必须实现这个方法:

void readValue(DicomInputStream dis, Attributes attrs) throws IOException;
void readValue(DicomInputStream dis, Sequence seq) throws IOException;
void readValue(DicomInputStream dis, Fragments frags) throws IOException;
void startDataset(DicomInputStream dis) throws IOException;
void endDataset(DicomInputStream dis) throws IOException;

startDatasetendDataset方法在流打开/关闭时启动。当找到属性、序列或片段时调用读取方法。您可以在dcm4che/dcm4che-tool/dcm4che-tool-dcmdump中看到完整的示例实现。

要将 dicom 图像读入 ajava.awt.image.BufferedImage您需要以javax.imageio.stream.ImageInputStream这种方式从 dicom 文件javax.imageio.ImageIO.createImageInputStream(dicomFile)中获取dicomFile一个java.io.File.

如果你想知道这个简单的代码是如何工作的,这是因为dcm4che-imageio插件。

您可以再次在dcm4che/dcm4che-tool/dcm4che-tool-dcm2jpg中看到完整的示例实现。

显然,您需要一个正确配置的 maven pom.xml,其中包含您需要的所有依赖项,至少:

<dependencies>
  <dependency>
    <groupId>org.dcm4che</groupId>
    <artifactId>dcm4che-imageio</artifactId>
    <version>3.3.7</version>
  </dependency>
  <dependency>
    <groupId>org.dcm4che</groupId>
    <artifactId>dcm4che-imageio-rle</artifactId>
    <version>3.3.7</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>com.sun.media</groupId>
    <artifactId>jai_imageio</artifactId>
    <version>1.2-pre-dr-b04</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.dcm4che.tool</groupId>
    <artifactId>dcm4che-tool-common</artifactId>
    <version>3.3.7</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
  </dependency>
</dependencies>

还有 dcm4che maven repo

<repositories>
  <repository>
    <id>www.dcm4che.org</id>
    <name>dcm4che Repository</name>
    <url>http://www.dcm4che.org/maven2</url>
</repository>

希望能帮助到你。

于 2015-09-18T06:33:27.983 回答
3

前段时间我写了一些代码,允许我读取“.dcm”文件并将它们导出到 BufferedImage 数据类型的数组中。

我使用了您可以在此处找到的库 dcm4che: http ://www.dcm4che.org/

在我编写的代码中,我使用了这些类:

import org.dcm4che3.imageio.plugins.dcm.*;
import org.dcm4che3.data.Tag;
import org.dcm4che3.io.DicomOutputStream;

首先,我使用了一种方法来读取 DICOM 文件并将其像素数据放入光栅中:

static BufferedImage createBufferedImgdFromDICOMfile(File dicomFile) {
   Raster raster = null ;
   System.out.println("Input: " + dicomFile.getName());

   //Open the DICOM file and get its pixel data
   try {
       Iterator iter = ImageIO.getImageReadersByFormatName("DICOM");
       ImageReader reader = (ImageReader) iter.next();
       DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam();
       ImageInputStream iis = ImageIO.createImageInputStream(dicomFile);
       reader.setInput(iis, false);
       //Returns a new Raster (rectangular array of pixels) containing the raw pixel data from the image stream
       raster = reader.readRaster(0, param);
       if (raster == null)
              System.out.println("Error: couldn't read Dicom image!");
       iis.close();
   }
    catch(Exception e) {
        System.out.println("Error: couldn't read dicom image! "+ e.getMessage());
        e.printStackTrace();
    }
   return get16bitBuffImage(raster);
}

然后我使用这种方法从先前从 DICOM 文件创建的光栅中获取像素,并将它们放入带有黑色和白色 ColorModel 的 BufferImage 中:

public static BufferedImage get16bitBuffImage(Raster raster) {
    short[] pixels = ((DataBufferUShort) raster.getDataBuffer()).getData();
    ColorModel colorModel = new ComponentColorModel(
        ColorSpace.getInstance(ColorSpace.CS_GRAY),
        new int[]{16},
        false,
        false,
        Transparency.OPAQUE,
        DataBuffer.TYPE_USHORT);
     DataBufferUShort db = new DataBufferUShort(pixels, pixels.length);
     WritableRaster outRaster = Raster.createInterleavedRaster(
        db,
        raster.getWidth(),
        raster.getHeight(),
        raster.getWidth(),
        1,
        new int[1],
        null);
     return new BufferedImage(colorModel, outRaster, false, null);
}

如果要将 BufferImage 导出为 JPEG 文件,可以使用以下方法:

private static void outputJpegImage(BufferedImage outputImage, String outputPath) {
   try {
   File outputJpegFile = new File(outputPath);
   OutputStream output = new BufferedOutputStream(new FileOutputStream(outputJpegFile));
   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
   encoder.encode(outputImage);
   output.close();
    } catch (IOException e) {
        System.out.println("Error: couldn't write jpeg image! "+ e.getMessage());
        e.printStackTrace();
    }
   System.out.println("Output: " + outputPath);
}
于 2017-10-10T17:14:22.730 回答
0

在 Java 中:

在 JAVA 中阅读的 DICOM 的最佳文章之一,请点击此链接

https://saravanansubramanian.com/dicomtutorials/#dicom-programming-tutorials-using-java

还有一件事你需要额外的软件来提取图像没有这个软件你无法读取图像和内容。

jai-1_1_2_01-lib-windows-i586-jdk.exe

jai_imageio-1_0_01-lib-windows-i586-jre.exe

因为 DICOM 图像的分辨率非常高。

您还需要 JDK32 位。

在 Web 项目中:配置了 JDK 路径的 Jre 路径。

于 2015-09-03T04:04:18.653 回答