You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用12位图像从零创建DICOM文件时图像模糊问题排查

问题分析与解决方案

从你的描述和代码来看,导致实际图像生成DICOM后模糊的原因主要有几个关键点,咱们逐个排查并修正:

1. 行列(Columns/Rows)设置完全颠倒

OpenCV读取的图像数组形状是(rows, columns)(也就是高度×宽度),但你代码里把Columns设为pixel_array.shape[0]Rows设为pixel_array.shape[1],这直接搞反了行列对应关系!

比如你的实际图像是(1500, 200),也就是1500行、200列,但代码会把DICOM的列数设为1500,行数设为200,图像被强行拉伸变形,自然看起来模糊。而测试数组是正方形(256×256),行列颠倒后还是正方形,所以显示正常。

修正代码

ds.Columns = pixel_array.shape[1]  # 图像宽度对应DICOM的Columns
ds.Rows = pixel_array.shape[0]     # 图像高度对应DICOM的Rows

2. 12位像素数据的DICOM位深参数不匹配

你的实际图像是12位uint16,但代码里设置了:

ds.HighBit = 15
ds.BitsStored = 16

这会让DICOM阅读器把12位的数据当成16位解析,导致亮度范围被错误映射(12位最大值是4095,16位是65535),图像对比度严重不足,看起来模糊。

同时,12位数据通常需要左移4位,把有效位放到16位的高位区域,这样阅读器才能正确识别有效数据范围。

修正代码

# 针对12位uint16数据调整位深参数
ds.BitsAllocated = 16
ds.BitsStored = 12
ds.HighBit = 11  # 12位数据的最高位是第11位(从0开始计数)

# 将12位数据左移4位,填充到16位的高位
if pixel_array.dtype == np.uint16:
    # 确保数据在12位合法范围(0-4095),避免溢出
    pixel_array = np.clip(pixel_array, 0, 4095)
    pixel_array = (pixel_array << 4).astype(np.uint16)

3. 缺少窗宽窗位设置

很多DICOM阅读器会自动计算窗宽窗位,但如果没有明确设置,对于非标准位深的数据,自动计算的结果可能不合适,导致图像显示模糊或偏暗。建议添加以下参数:

# 针对12位数据设置合适的窗宽窗位
ds.WindowCenter = 2048  # 12位数据的中间值
ds.WindowWidth = 4096   # 覆盖0-4095的全范围
ds.WindowCenterWidthExplanation = "Full range of 12-bit data"

4. 拼写错误修正

代码里有个拼写错误,可能导致部分阅读器解析异常:

# 原代码:少了一个字母a
# ds.SecondaryCaptureDeviceManufctur = 'AZMed_SAS'
# 修正为:
ds.SecondaryCaptureDeviceManufacturer = 'AZMed_SAS'

补充:废弃API替换

代码里的tostring()已经是NumPy的废弃API,建议替换为tobytes()

ds.PixelData = pixel_array.tobytes()

把这些修正整合到你的函数中,应该就能解决实际图像模糊的问题了。

内容的提问来源于stack exchange,提问作者toing_toing

火山引擎 最新活动