如何用Java读取DICOM文件的内容?

时间:2015-07-10 23:21:45

标签: java dicom dcm4che

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

3 个答案:

答案 0 :(得分:5)

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

读取Dicom文件的元信息是从dicom文件创建org.dcm4che3.io.DicomInputStream并使用实现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方法。在找到属性,序列或片段时调用read方法。您可以在dcm4che/dcm4che-tool/dcm4che-tool-dcmdump中看到完整的示例实现。

要将dicom图像读入java.awt.image.BufferedImage,您需要以这种javax.imageio.stream.ImageInputStream方式从dicom文件中获取javax.imageio.ImageIO.createImageInputStream(dicomFile),其中dicomFilejava.io.File。< / p>

如果您想知道这个简单代码是如何工作的,那是因为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>

希望它有所帮助。

答案 1 :(得分:1)

我前段时间写过一些代码,它们让我读取“.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);
}

答案 2 :(得分:-2)

在Java中:

在JAVA中读取DICOM的最佳文章之一是关注此链接

http://www.saravanansubramanian.com/Saravanan/Articles_On_Software/Entries/2014/10/6_DICOM_Basics_-_Extracting_Image_Pixel_Data.html

如果没有此软件,您还需要额外的软件来提取图像,而无法读取图像和内容。

JAI-1_1_2_01-LIB - 窗口i586的-jdk.exe

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

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

您还需要JDK32位。

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