python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加

【1】引言

前序已经学习了直接在画布上使用掩模,会获得彩色图像的多种叠加效果,相关文章链接为:

python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖-优快云博客

这时候如果更进一步,直接用两张图片互相叠加,是否会有新的图像出现?这就是本次文章想讨论的内容。

在更早的时候,我们已经掌握了对灰度图像的掩模操作:

python学opencv|读取图像(九)用numpy创建黑白相间灰度图_numpy生成全黑图片-优快云博客

因此,这种图片叠加的操作,应该可以同时作用于灰度图像和彩色图像。

探索图像的叠加效果,需要使用的函数是cv2.add()。

【2】官网教程

点击下述链接,可以直达cv2.add()函数官网说明:

OpenCV: Operations on arrays

官网页面关于cv2.add()函数的说明为:

图1

具体的各个参数的意义为:

void cv::add     (     InputArray     src1,   #输入图像1
        InputArray     src2,                         #输入图像2
        OutputArray     dst,                        #输出图像2
        InputArray     mask = noArray(),    #掩模
        int     dtype = -1 )                           #输出图像的深度,为默认值,暂无需关注

【3】代码测试

【3.1】灰度图像

首先是引入cv2等模块和原始图像:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块


# 读取图片-直接转化灰度图
src = cv.imread('srcf.png',0) #读取图像
dst=src#输出图像

然后进行图形叠加操作:

#图像叠加
dst1=dst+dst #图像使用“+”叠加
dst2=cv.add(dst,dst) #图像使用“cv.add()函数”叠加

然后在屏幕上展示图像:

#在屏幕展示效果
cv.imshow('srcdst', dst)  # 在屏幕展示效果
cv.imshow('srcdst1', dst1)  # 在屏幕展示效果
cv.imshow('srcdst2', dst1)  # 在屏幕展示效果

为探寻实际的叠加效果,读取了特定像素点的BGR值:

#显示BGR值
print("dst像素数为[258,258]位置处的BGR=", dst[258, 258])  # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[258,258]位置处的BGR=", dst1[258,258])  # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[258,258]位置处的BGR=", dst2[258,258])  # 获取像素数为[100,100]位置处的BGR
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100,100])  # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100,100])  # 获取像素数为[100,100]位置处的BGR

之后保存相关图像:

#保存图像
cv.imwrite('srcf-dst.png', dst)  # 保存图像
cv.imwrite('srcf-dst1.png', dst1)  # 保存图像
cv.imwrite('srcf-dst2.png', dst2)  # 保存图像

cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

本文使用的原始图像为:

图2 原始图像

叠加后的图像效果为:

图3 图像使用“+”叠加-灰度图像

图4 图像使用“cv.add()函数”叠加-灰度图像

由图3和图4对比可见:图4相对来说更亮。

这时候,再看特定点的BGR值:

图5 特定像素点BGR值-灰度图像

在像素点[258,258]获得的原始图像dst对应的BGR=71,dst1和dst2在该点对应的BGR=142=2*71,可以明显看到使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加。

在像素点[100,100]获得的原始图像dst对应的BGR=156,dst1在该点对应的BGR=56,dst2在该点对应的BGR=255。实际上,使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加,但对于使用“+”叠加,像素点BGR值超过255后会重新计数,57=156*2-255,但由于像素点是从0开始计算,所以第57个数对应的BGR值为56;使用和“cv.add()函数”叠加,像素点BGR值超过255后会直接截断为255。

【3.2】彩色图像

之后进行彩色图像的零值和反零值处理,这只需要改一行代码,将src = cv.imread('srcun.png',0)改为:

src = cv.imread('srcun.png') #读取图像

直接输出完整代码:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块


# 读取图片-直接转化灰度图
src = cv.imread('srcf.png') #读取图像
dst=src#输出图像

#图像叠加
dst1=dst+dst #图像使用“+”叠加
dst2=cv.add(dst,dst) #图像使用“cv.add()函数”叠加

#在屏幕展示效果
cv.imshow('srcdst', dst)  # 在屏幕展示效果
cv.imshow('srcdst1', dst1)  # 在屏幕展示效果
cv.imshow('srcdst2', dst2)  # 在屏幕展示效果

#显示BGR值
print("dst像素数为[258,258]位置处的BGR=", dst[258, 258])  # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[258,258]位置处的BGR=", dst1[258,258])  # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[258,258]位置处的BGR=", dst2[258,258])  # 获取像素数为[100,100]位置处的BGR
print("dst像素数为[100,100]位置处的BGR=", dst[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dst1像素数为[100,100]位置处的BGR=", dst1[100,100])  # 获取像素数为[100,100]位置处的BGR
print("dst2像素数为[100,100]位置处的BGR=", dst2[100,100])  # 获取像素数为[100,100]位置处的BGR

#保存图像
cv.imwrite('srcf-c-dst.png', dst)  # 保存图像
cv.imwrite('srcf-c-dst1.png', dst1)  # 保存图像
cv.imwrite('srcf-c-dst2.png', dst2)  # 保存图像

cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行后获得的图像效果为:

图6 图像使用“+”叠加-灰度图像

图7 图像使用“cv.add()函数”叠加-彩色图像

此时的特定像素点BGR值为:

图8 特定像素点BGR值-彩色图像

对像素点[258,258]和像素点[100,100]获得的原始图像dst对应的BGR和叠加后的图像dst1、dst2在该点对应的BGR分析可知:使用“+”叠加和“cv.add()函数”叠加的效果在本质上都是对该像素点的BGR值进行叠加,但对于使用“+”叠加,像素点BGR值超过255后会重新计数;使用和“cv.add()函数”叠加,像素点BGR值超过255后会直接截断为255。

图9 对比效果

【4】细节说明

如果相互叠加的两个图像原本对应的BGR值分别为BGR1和BGR2,使用“+”叠加时,重新计数的BGR=BGR1+BGR2-255-1。

【5】总结

掌握了python+opencv实现各个像素点BGR叠加的技巧。

import cv2 import math import numpy as np import matplotlib.pyplot as plt #< h2 > 第一步: 以imread方式读取灰度图 < / h2 > path = './save_img/clahe_enhanced.png' # 原图展示 original = cv2.imread(path) # cv2.imshow('Original', original) # cv2.waitKey(0) # cv2.destroyAllWindows() # 以imread方式读入图片 img = cv2.imread(path, 0) # 利用高斯滤波平滑降噪 blur = cv2.GaussianBlur(img, (7, 7), 0) """Prewitt算子适合用来识别噪声较多、灰度渐变的图像,相比于Roberts算子,在水平方向和竖直方向上对边缘的检测更加明显""" # 利用Prewitt算子增强骨骼细节 kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int) kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int) x = cv2.filter2D(img, cv2.CV_16S, kernelx) y = cv2.filter2D(img, cv2.CV_16S, kernely) # 转uint8 absX = cv2.convertScaleAbs(x) absY = cv2.convertScaleAbs(y) Prewitt = cv2.addWeighted(absX, 1., absY, 1., 0) #cv2.imshow('Prewitt', Prewitt) cv2.imwrite('./save_img/Prewitt.png', Prewitt) #cv2.waitKey(0) #cv2.destroyAllWindows() """--------叠加-------""" # 将处理后的图像叠加到img上 img_Prewitt = cv2.add(img, Prewitt) # cv2.imshow('img_Prewitt', img_Prewitt) cv2.imwrite('./save_img/img_Prewitt.png', img_Prewitt) # cv2.waitKey(0) # cv2.destroyAllWindows() #< h2 > 第二步: 以cvtColor读取灰度图 < / h2 > # 以cvtColor读入 #img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # cv2.imshow('o', img) # cv2.waitKey(0) # cv2.destroyAllWindows() # 利用高斯滤波降噪 blur = cv2.GaussianBlur(img, (7, 7), 0) # 利用Laplacian增强骨骼图像细节 def Laplace(img): h = img.shape[0] w = img.shape[1] res = img.copy() L = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]) for i in range(h - 2): for j in range(w - 2): res[i + 1, j + 1] = np.clip(np.abs(np.sum(img[i:i + 3, j:j + 3] * L)), 0, 255) return np.uint8(res) Laplacian = Laplace(blur) # 将原始图像与Laplacian处理后的图像叠加 img_Laplacian = cv2.addWeighted(img, 1.0, Laplacian, 1.0, 0) # cv2.imshow('Laplacian', Laplacian) cv2.imwrite('./save_img/Laplacian.png', Laplacian) # cv2.imshow('img_Laplacian', img_Laplacian) # 保存Laplacian处理后的图像 cv2.imwrite('./save_img/img_Laplacian.png', img_Laplacian) # cv2.waitKey(0) # cv2.destroyAllWindows() # 利用Sobel算子增强灰度变化较弱的细节——>肉质细节 x = cv2.Sobel(img, cv2.CV_16S, 1, 0, ksize=3) y = cv2.Sobel(img, cv2.CV_16S, 0, 1, ksize=3) absx = cv2.convertScaleAbs(x) absy = cv2.convertScaleAbs(y) Sobel = cv2.addWeighted(absx, 1., absy, 1., 0) # 结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑了像素空间差异与强度差异,达到保边去噪的目的。 # 均值滤波、中值滤波和高斯滤波,都属于各向同性滤波,它们对待噪声和图像的边缘信息都采取一视同仁的处理方式, # 噪声被磨平的同时,图像中具有重要地位的边缘、纹理和细节也同时被抹平 # 利用双边滤波平滑噪声并保留边界 img_Sobel = cv2.bilateralFilter(Sobel, 5, 11, 11) # cv2.imshow('Sobel', Sobel) cv2.imwrite('./save_img/Sobel.png', Sobel) # cv2.imshow('img_Sobel', img_Sobel) cv2.imwrite('./save_img/img_Sobel.png', img_Sobel) # cv2.waitKey(0) # cv2.destroyAllWindows() # 将上述两个代码块的图像按指定权重叠加保留变化强烈的写别,平滑灰度变化平缓的噪声 # 图像融合 blend = cv2.addWeighted(img_Laplacian, .5, img_Sobel, .5, 0) # blend = cv2.add(img_Laplacian, img_Sobel) # 将结果转换回 uint8 类型 blend = np.clip(blend, 0, 255).astype(np.uint8) # cv2.imshow("blend", blend) cv2.imwrite('./save_img/blend.png', blend) # cv2.waitKey(0) # cv2.destroyAllWindows() # 利用中值滤波再次平滑图像 img_Spicy = cv2.medianBlur(blend, 3) # cv2.imshow('img_Spicy', img_Spicy) cv2.imwrite('./save_img/img_Spicy.png', img_Spicy) # cv2.waitKey(0) # cv2.destroyAllWindows() # 第三步: 将两种方式处理的图像叠加 < / h2 > # 将两种方式处理后的图像叠加 add = cv2.addWeighted(img_Prewitt, 0.3, img_Spicy, 1.0, 0) # cv2.imshow('add', add) cv2.imwrite('./save_img/add.png', add) # cv2.waitKey(0) # cv2.destroyAllWindows() # 将结果叠加到原图并做灰度图幂变换 def gammaTranform(c, gamma, image): h, w = image.shape[0], image.shape[1] new_img = np.zeros((h, w), dtype=np.float32) for i in range(h): for j in range(w): new_img[i, j] = c * math.pow(image[i, j], gamma) cv2.normalize(new_img, new_img, 0, 255, cv2.NORM_MINMAX) new_img = cv2.convertScaleAbs(new_img) return new_img res = gammaTranform(1, 0.6, add) # cv2.imshow('res', res) cv2.imwrite('./save_img/res.png', res) # cv2.waitKey(0) # cv2.destroyAllWindows() 怎么改成适合输入dicom而不是png
最新发布
08-09
<think>我们有一个任务:将现有的处理PNG图像Python代码(使用OpenCV)修改为支持DICOM格式的医图像处理。 根据引用[1],我们知道DICOM格式是医疗图像的标准格式,可以使用pydicom模块来读取解析DICOM文件。 同时,引用[1]中也提到,在读取DICOM文件后,可以使用OpenCV图像进行处理(如截取、灰度化、二值化等)。 因此,修改步骤大致如下: 1. 使用pydicom读取DICOM文件,获取其中的像素数据。 2. 将DICOM像素数据转换为OpenCV能够处理的格式(通常是numpy数组)。 3. 由于DICOM图像可能包含多个平面(如RGB)或者单通道(如灰度),需要注意转换后的数据类型和通道数。 4. 然后,将转换后的图像数据传递给原有的OpenCV处理流程(原本处理PNG图像的代码)。 5. 处理完成后,如果需要保存为图像,可以使用OpenCV保存为PNG或其他格式,或者如果需要保存为DICOM,则使用pydicom进行保存(但通常处理后的图像保存为普通格式即可)。 注意:DICOM文件除了像素数据,还包含很多元数据(如患者信息、检查信息等)。如果后续处理需要这些信息,则要妥善保存。但如果我们只关心图像像素,那么可以忽略。 具体步骤: 步骤1:安装必要的库 如果还没有安装pydicom和opencv,需要先安装: ``` pip install pydicom opencv-python ``` 步骤2读取DICOM文件 使用pydicom读取DICOM文件,并提取像素数组。 步骤3:将DICOM像素数组转换为OpenCV图像格式 DICOM像素数组可能是16位或8位,而OpenCV通常使用8位无符号整数(0-255)或16位无符号整数(0-65535)。我们需要根据实际情况进行转换。 通常,DICOM图像是单通道的(灰度图像),但也可以是三通道(如彩色超声)。所以需要检查DICOM文件的“Photometric Interpretation”属性(如MONOCHROME1, MONOCHROME2, RGB等)。 常见的转换步骤: a) 将pydicom读取的像素数据转换为numpy数组:`dcm_array = ds.pixel_array` b) 根据DICOM图像的类型,可能需要调整窗宽窗位(Window Center and Width)来显示,但如果我们只是进行图像处理,可能不需要显示,而是直接处理原始数据。不过,如果后续处理需要8位图像,则需要进行归一化或窗宽窗位调整。 步骤4:将数组转换为OpenCV图像 如果原始处理代码是针对8位图像的,那么我们需要将DICOM像素数据归一化到0-255。但是注意,DICOM像素值可能是16位,而且范围可能很大。我们可以使用线性拉伸(如min-max归一化)或者使用窗宽窗位(更符合医图像的显示)来转换。 这里提供一个简单的归一化方法(min-max归一化): ```python # 假设dcm_array是提取的像素数组 normalized_array = cv2.normalize(dcm_array, None, 0, 255, cv2.NORM_MINMAX) image_8bit = normalized_array.astype('uint8') ``` 但是,注意:有些DICOM图像可能有多个通道(如RGB),那么上述归一化需要对每个通道进行?实际上,如果是RGB,则像素数组已经是三通道,且每个通道的值范围可能不同。所以需要根据实际情况处理。 步骤5:使用OpenCV处理图像 现在,`image_8bit`就是OpenCV可以处理的图像(单通道或多通道)。然后,我们可以将原来的处理PNG图像的代码应用到这个图像上。 步骤6:保存结果 处理完成后,可以使用OpenCV保存为PNG格式,例如:`cv2.imwrite('output.png', processed_image)` 示例代码: 假设原来处理PNG图像的代码如下: ```python import cv2 def process_image(image): # 假设这是原来的处理函数,例如灰度化(如果已经是灰度则跳过)、二值化等 # 这里以二值化为例 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 如果原图是彩色,转灰度 _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) return binary # 原来的读取PNG的代码 # image = cv2.imread('input.png') # processed_image = process_image(image) # cv2.imwrite('output.png', processed_image) ``` 修改为支持DICOM的代码: ```python import cv2 import pydicom import numpy as np def process_dicom(dicom_path): # 读取DICOM文件 ds = pydicom.dcmread(dicom_path) # 获取像素数组 dcm_array = ds.pixel_array # 将像素数组归一化到0-255,并转换为8位 # 注意:如果图像是RGB,则归一化时要注意,这里我们做简单处理,假设是单通道或RGB都可以用同样的归一化(每个通道独立归一化?) # 但是,OpenCV的归一化函数默认是对每个通道独立归一化的(如果数组是三维的) # 如果dcm_array是16位深度,归一化到8位 if dcm_array.dtype != np.uint8: normalized_array = cv2.normalize(dcm_array, None, 0, 255, cv2.NORM_MINMAX) image_8bit = normalized_array.astype('uint8') else: image_8bit = dcm_array # 注意:DICOM像素数组可能是单通道,也可能是多通道。如果是单通道,我们需要将其转换为三通道吗?这取决于后续处理。 # 如果后续处理(如process_image)要求三通道,那么我们可以复制通道:image_8bit = cv2.cvtColor(image_8bit, cv2.COLOR_GRAY2BGR) # 但我们的process_image函数内部会转灰度(如果是彩色的话),所以这里我们可以先不转换,因为二值化只需要单通道。 # 但是,注意:在原始process_image中,如果是彩色图,会转灰度。而我们的DICOM如果是灰度,则已经是单通道,所以直接传入即可。 # 但是,如果原始process_image要求输入是彩色(BGR三通道),那么我们需要将单通道的DICOM图像转换为三通道(因为单通道图像cvtColor中会报错,要求输入是彩色才能转灰度) # 因此,我们需要根据原始处理函数的输入要求来调整。 # 假设原始处理函数process_image要求输入是彩色图像(三通道),那么我们将单通道的DICOM图像转换为三通道(重复三个通道) if len(image_8bit.shape) == 2: image_8bit = cv2.cvtColor(image_8bit, cv2.COLOR_GRAY2BGR) # 调用原来的处理函数 processed_image = process_image(image_8bit) # 保存结果 cv2.imwrite('output.png', processed_image) # 调用 process_dicom('input.dcm') ``` 但是,请注意:DICOM图像可能有不同的光度解释(Photometric Interpretation),例如反转(MONOCHROME1表示灰度值0表示白色,1表示黑色,而MONOCHROME2则相反)。所以,在归一化之前,可能需要根据光度解释进行反转。不过,在医图像处理中,通常我们处理的是原始像素数据,然后根据显示需求调整。如果后续处理对亮度方向敏感,那么需要根据光度解释进行反转。 引用[1]中提到,在读取DICOM文件后,进行了图像的截取、灰度化、二值化等操作。其中,灰度化实际上在DICOM图像中通常已经是灰度,所以可能不需要。但二值化可能需要。 因此,更健壮的方法可能需要考虑光度解释。例如: ```python if ds.PhotometricInterpretation == 'MONOCHROME1': # 反转灰度,使得0表示白色,255表示黑色(在二值化时可能需要反转,或者我们可以在这里反转整个图像) # 注意:归一化后,我们反转:白色变成0,黑色变成255?但通常我们的二值化是黑色背景,白色目标。 # 所以,如果原始图像是MONOCHROME1(即高值表示暗,低值表示亮),那么我们需要反转,使得高值变成亮,低值变成暗? # 实际上,在显示时,我们通常希望背景是黑色,目标是白色。所以对于MONOCHROME1,我们可以用255减去当前值。 image_8bit = 255 - image_8bit # 对于MONOCHROME2,则不需要反转,因为低值表示暗,高值表示亮。 ``` 不过,这个反转操作取决于后续处理的要求。如果后续处理不关心亮暗的方向,则可以不用反转。 总结:修改的关键点在于使用pydicom读取DICOM文件,将像素数组转换为OpenCV可处理的8位图像(可能需要归一化和通道转换),然后调用原有的处理流程。 注意:如果原有的OpenCV处理流程是针对彩色图像的,那么需要将单通道的DICOM图像转换为三通道(伪彩色,三个通道值相同)。如果原有的处理流程可以处理单通道图像,则无需转换。 另外,如果DICOM图像是YBR_FULL等彩色空间,则需要转换为RGB。但通常医图像是灰度图。如果遇到彩色DICOM(如多帧或彩色超声),则需要根据情况转换。 关于DICOM彩色空间转换,可以使用pydicom的转换函数,或者使用OpenCV进行转换。但一般情况下,我们遇到的DICOM图像大多是灰度图。 因此,修改代码时,需要了解原始代码对图像的要求(通道数、位深度、颜色空间等),然后对从DICOM读取图像进行相应的转换。 如果遇到多帧DICOM(即包含多个图像),则需要遍历每一帧进行处理。 最后,根据引用[2],我们还可以使用其他图像处理库,如FreeImage、ITK等,但这里我们按照要求使用OpenCV和pydicom。 因此,修改后的代码框架如上所示,具体细节需要根据原始处理代码和DICOM图像的具体属性进行调整。 相关问题: 1. 如何读取DICOM文件中的元数据(如患者信息)? 2. 如何处理多帧DICOM图像? 3. 如何将处理后的图像保存为DICOM格式(保留元数据)? 4. 在医图像处理中,窗宽窗位调整的具体步骤是什么? 5. 如何将DICOM图像转换为OpenCV图像时保留原始数据的动态范围(而不进行归一化)? 6. 如果DICOM图像是12位或16位深度,如何正确转换为8位深度?</think>要将使用OpenCV处理PNG图像Python代码修改为支持DICOM格式,需要遵循以下步骤: ### 修改步骤 1. **安装必要的库** ```python pip install pydicom opencv-python ``` 2. **替换图像读取方式** ```python # 原PNG读取代码 import cv2 image = cv2.imread('input.png') # 修改为DICOM读取 import pydicom ds = pydicom.dcmread('input.dcm') image = ds.pixel_array # 获取像素数据 ``` 3. **数据类型转换** ```python # DICOM通常使用16位深度,需转换为OpenCV支持的8位 if image.dtype != np.uint8: image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX) image = image.astype(np.uint8) # 若需三通道(如原代码处理彩色) if len(image.shape) == 2: # 单通道灰度图 image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) ``` 4. **应用原有处理逻辑** ```python # 此处保留原有的OpenCV处理代码 processed_image = your_processing_function(image) # 例如二值化/滤波等 ``` 5. **结果输出** ```python # 保存为PNG cv2.imwrite('output.png', processed_image) # 或保存为DICOM(保留元数据) ds.PixelData = processed_image.tobytes() ds.save_as('output.dcm') ``` ### 完整示例代码 ```python import cv2 import pydicom import numpy as np def process_medical_image(input_path): # 读取DICOM ds = pydicom.dcmread(input_path) image = ds.pixel_array # 转换为8位并确保三通道 image = cv2.normalize(image, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) if len(image.shape) == 2: image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) # === 此处插入原有处理逻辑 === # 示例:灰度化 + 二值化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # =========================== # 保存结果 cv2.imwrite('processed.png', binary) return binary # 使用示例 process_medical_image('CT_scan.dcm') ``` ### 关键注意事项 1. **位深度处理** DICOM图像常为12-16位深度,需通过`cv2.normalize()`线性映射到0-255范围[^1]。 2. **光度解释校正** 检查DICOM的`PhotometricInterpretation`标签: ```python if ds.PhotometricInterpretation == 'MONOCHROME1': image = np.invert(image) # 反转灰度值 ``` 3. **多帧图像处理** 对DICOM多帧数据(如超声)需遍历帧: ```python for frame in range(ds.NumberOfFrames): image = ds.pixel_array[frame] # 处理单帧 ``` 4. **元数据保留** 修改DICOM文件时需更新相关元数据: ```python ds.Rows, ds.Columns = processed_image.shape[:2] ds.BitsStored = 8 # 修改位深度 ``` > **重要提示**:医疗图像处理需严格遵守DICOM标准,涉及诊断时建议使用专用库如[ITK](https://itk.org/)或[SimpleITK](https://simpleitk.org/)[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值