DICOM ファイルには、一連の CAT スキャン画像が含まれています。ファイルを読み取り、そこに保存されている画像を抽出できる Java の DICOM ライブラリの実装はありますか? これらの画像を BufferedImage データ型に保存したいと思います。
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);
}
Java の場合:
JAVAで読むDICOMの最高の記事の1つは、このリンクに従ってください
https://saravanansubramanian.com/dicomtutorials/#dicom-programming-tutorials-using-java
もう1つ、このソフトウェアがないと画像とコンテンツを読み取ることができない画像を抽出するための追加のソフトウェアが必要です。
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 パスを設定しました。