DICOM文件包含一系列CAT扫描图像。 Java中是否有DICOM库的实现可以读取文件并提取存储在其中的图像?我想将这些图像存储到BufferedImage数据类型中。
答案 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;
流打开/关闭时会启动 startDataset
和endDataset
方法。在找到属性,序列或片段时调用read方法。您可以在dcm4che/dcm4che-tool/dcm4che-tool-dcmdump中看到完整的示例实现。
要将dicom图像读入java.awt.image.BufferedImage
,您需要以这种javax.imageio.stream.ImageInputStream
方式从dicom文件中获取javax.imageio.ImageIO.createImageInputStream(dicomFile)
,其中dicomFile
为java.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的最佳文章之一是关注此链接
如果没有此软件,您还需要额外的软件来提取图像,而无法读取图像和内容。
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。