jpeg压缩python代码_如何使用pydicom创建JPEG压缩DICOM数据集?

我正在尝试使用pydicom创建JPEG压缩的DICOM图像。一个很好的源材料关于彩色DICOM图像可以找到{A2},但主要是理论和C++。在下面的代码示例中,我在output-raw.dcm(未压缩)内创建了一个浅蓝色省略号,如下所示:

import io

from PIL import Image, ImageDraw

from pydicom.dataset import Dataset

from pydicom.uid import generate_uid, JPEGExtended

from pydicom._storage_sopclass_uids import SecondaryCaptureImageStorage

WIDTH = 100

HEIGHT = 100

def ensure_even(stream):

# Very important for some viewers

if len(stream) % 2:

return stream + b"\x00"

return stream

def bob_ross_magic():

image = Image.new("RGB", (WIDTH, HEIGHT), color="red")

draw = ImageDraw.Draw(image)

draw.rectangle([10, 10, 90, 90], fill="black")

draw.ellipse([30, 20, 70, 80], fill="cyan")

draw.text((11, 11), "Hello", fill=(255, 255, 0))

return image

ds = Dataset()

ds.is_little_endian = True

ds.is_implicit_VR = True

ds.SOPClassUID = SecondaryCaptureImageStorage

ds.SOPInstanceUID = generate_uid()

ds.fix_meta_info()

ds.Modality = "OT"

ds.SamplesPerPixel = 3

ds.BitsAllocated = 8

ds.BitsStored = 8

ds.HighBit = 7

ds.PixelRepresentation = 0

ds.PhotometricInterpretation = "RGB"

ds.Rows = HEIGHT

ds.Columns = WIDTH

image = bob_ross_magic()

ds.PixelData = ensure_even(image.tobytes())

image.save("output.png")

ds.save_as("output-raw.dcm", write_like_original=False) # File is OK

#

# Create compressed image

#

output = io.BytesIO()

image.save(output, format="JPEG")

ds.PixelData = ensure_even(output.getvalue())

ds.PhotometricInterpretation = "YBR_FULL_422"

ds.file_meta.TransferSyntaxUID = JPEGExtended

ds.save_as("output-jpeg.dcm", write_like_original=False) # File is corrupt

最后,我尝试创建压缩的DICOM:我尝试设置各种传输语法,使用PIL进行压缩,但没有成功。我认为生成的DICOM文件已损坏。如果要将原始DICOM文件转换为使用gdcm工具压缩的JPEG:

^{pr2}$

通过对这个转换后的文件进行dcmdump,我们可以看到一个有趣的结构,我不知道如何使用pydicom进行复制:$ dcmdump output-jpeg.dcm

# Dicom-File-Format

# Dicom-Meta-Information-Header

# Used TransferSyntax: Little Endian Explicit

(0002,0000) UL 240 # 4, 1 FileMetaInformationGroupLength

(0002,0001) OB 00\01 # 2, 1 FileMetaInformationVersion

(0002,0002) UI =SecondaryCaptureImageStorage # 26, 1 MediaStorageSOPClassUID

(0002,0003) UI [1.2.826.0.1.3680043.8.498.57577581978474188964358168197934098358] # 64, 1 MediaStorageSOPInstanceUID

(0002,0010) UI =JPEGLossless:Non-hierarchical-1stOrderPrediction # 22, 1 TransferSyntaxUID

(0002,0012) UI [1.2.826.0.1.3680043.2.1143.107.104.103.115.2.8.4] # 48, 1 ImplementationClassUID

(0002,0013) SH [GDCM 2.8.4] # 10, 1 ImplementationVersionName

(0002,0016) AE [gdcmconv] # 8, 1 SourceApplicationEntityTitle

# Dicom-Data-Set

# Used TransferSyntax: JPEG Lossless, Non-hierarchical, 1st Order Prediction

...

... ### How to do the magic below?

...

(7fe0,0010) OB (PixelSequence #=2) # u/l, 1 PixelData

(fffe,e000) pi (no value available) # 0, 1 Item

(fffe,e000) pi ff\d8\ff\ee\00\0e\41\64\6f\62\65\00\64\00\00\00\00\00\ff\c3\00\11... # 4492, 1 Item

(fffe,e0dd) na (SequenceDelimitationItem) # 0, 0 SequenceDelimitationItem

我试图使用pydicom的encaps module,但我认为它主要用于读取数据,而不是写入。还有谁知道如何处理这个问题,如何创建/编码这些PixelSequence?想在没有运行外部工具的情况下用纯Python创建JPEG压缩dicom。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值