在实现pirntSCU时,需要将dicom图像转为灰度图像,使用以下代码进行转换时,预览的图像发生了偏移,使用类库dcm4che3,如何解决偏移问题,代码如下:
public static byte[] convertToGreyImage(File imgFile) throws IOException {
DicomInputStream dicomInputStream = new DicomInputStream(imgFile);
// Attributes attrs = dicomInputStream.readDataset();
ImageInputStream imageInputStream = ImageIO.createImageInputStream(dicomInputStream);
// 获取DICOM图像读取器
Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByFormatName("DICOM");
ImageReader imageReader = imageReaders.next();
// DICOM图像读取参数
DicomImageReadParam dicomReadParam = (DicomImageReadParam) imageReader.getDefaultReadParam();
dicomReadParam.setWindowCenter(40); // DICOM窗位
dicomReadParam.setWindowWidth(400); // DICOM窗宽
//自动计算窗位窗宽
dicomReadParam.setAutoWindowing(true);
// dicomReadParam.setPresentationState(attrs);
dicomReadParam.setDestinationType(ImageTypeSpecifier.createGrayscale(8, DataBuffer.TYPE_BYTE,false));
// 设置图像读取器的输入流
imageReader.setInput(imageInputStream, false);
// 读取DICOM图像
BufferedImage dicomImage = imageReader.read(0, dicomReadParam);
//获取图像偏移信息
int offsetX = dicomImage.getMinX();
int offsetY = dicomImage.getMinY();
// 将DICOM图像转换为灰度图像
BufferedImage greyImage = new BufferedImage(dicomImage.getWidth(), dicomImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics2D graphics = greyImage.createGraphics();
graphics.drawImage(dicomImage, -offsetX, -offsetY, null);
graphics.dispose();
// 获取TIFF ImageWriter
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIF").next();
// 设置压缩参数(可选)
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_DEFAULT);
// 将灰度图像转换为字节数组
// 将图像写入 ByteArrayOutputStream
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
writer.setOutput(ios);
writer.write(null, new javax.imageio.IIOImage(greyImage, null, null), param);
ios.close();
// ImageIO.write(greyImage, "TIFF", outputStream);
byte[] greyBytes = outputStream.toByteArray();
// 关闭流
dicomInputStream.close();
imageInputStream.close();
outputStream.close();
return greyBytes;
}
最终预览的效果如下:
【以下回答由 GPT 生成】
这个问题的原因是图像发生了偏移。发生偏移的原因是在绘制灰度图像时,没有正确处理图像的偏移信息。解决这个问题的方法是,在绘制灰度图像之前,先获取图像的偏移信息,并在绘制时进行相应的处理。
下面是修改后的代码,解决了图像偏移的问题:
public static byte[] convertToGreyImage(File imgFile) throws IOException {
DicomInputStream dicomInputStream = new DicomInputStream(imgFile);
ImageInputStream imageInputStream = ImageIO.createImageInputStream(dicomInputStream);
// 获取DICOM图像读取器
Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByFormatName("DICOM");
ImageReader imageReader = imageReaders.next();
// DICOM图像读取参数
DicomImageReadParam dicomReadParam = (DicomImageReadParam) imageReader.getDefaultReadParam();
dicomReadParam.setWindowCenter(40); // DICOM窗位
dicomReadParam.setWindowWidth(400); // DICOM窗宽
dicomReadParam.setAutoWindowing(true); // 自动计算窗位窗宽
// 设置图像读取器的输入流
imageReader.setInput(imageInputStream, false);
// 读取DICOM图像
BufferedImage dicomImage = imageReader.read(0, dicomReadParam);
// 获取图像偏移信息
int offsetX = dicomImage.getMinX();
int offsetY = dicomImage.getMinY();
// 将DICOM图像转换为灰度图像
BufferedImage greyImage = new BufferedImage(dicomImage.getWidth(), dicomImage.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics2D graphics = greyImage.createGraphics();
graphics.drawImage(dicomImage, -offsetX, -offsetY, null);
graphics.dispose();
// 获取灰度图像的字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(greyImage, "JPEG", baos);
baos.flush();
byte[] greyImageBytes = baos.toByteArray();
baos.close();
return greyImageBytes;
}
这个修改后的代码解决了图像偏移的问题。在绘制灰度图像时,根据图像的偏移信息,将图像进行正确的偏移以保证图像位置的准确性。