Python计算DICOM图像两点真实距离

Python计算DICOM图像两点真实距离

对比测量结果图

DICOM阅读器(小赛看看)测量结果
原图
python测量结果
python测量

Code

import numpy as np
import cv2
import math
import pydicom
from pydicom.pixel_data_handlers.util import convert_color_space

ds = pydicom.dcmread("./your_dicom_path.dcm")
# 第几张图, dtype根据Bits Allocated定义
img = np.asarray(ds.pixel_array[0], dtype='uint8')
# 获取色彩空间
color_space = ds.get(0x00280004).value
# 颜色空间转换
img = convert_color_space(img, color_space, 'RGB')
# BGR转RGB
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 像素和真实空间比例尺
autio_x = ds.get(0x00280030).value[0]
autio_y = ds.get(0x00280030).value[1]

p1 = None
p2 = None

# 欧股定理
def cal_euler(p1, p2):
    a2 = ((p2[1] - p1[1]) * autio_x) ** 2
    b2 = ((p2[0] - p1[0]) * autio_y) ** 2
    res = math.sqrt(a2 + b2)
    return res

# 鼠标事件
def mouseHandler(event, x, y, flags, param):
    global p1, p2
    if event == cv2.EVENT_LBUTTONDOWN:
        point = (x, y)
        if p1 == None:
            p1 = point
        else:
            p2 = point
        print(point)
        cv2.destroyAllWindows()

cv2.namedWindow('p1')
cv2.setMouseCallback('p1', mouseHandler)
cv2.imshow('p1', img)
cv2.waitKey()

cv2.namedWindow('p2')
cv2.setMouseCallback('p2', mouseHandler)
cv2.imshow('p2', img)
cv2.waitKey()

res = cal_euler(p1, p2)

img = cv2.line(img, p1, p2, (0, 0, 255), 1, 1)
cv2.putText(img, str(round(res, 2)) + "mm", p2, cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 1, cv2.LINE_AA)
cv2.imshow('res', img)
cv2.waitKey()

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
针对冠脉dicom图像分割,可以使用Python中的Pydicom和OpenCV库来实现。具体步骤如下: 1.使用Pydicom库读取DICOM文件,获取图像数组。 ```python import pydicom import numpy as np ds = pydicom.dcmread('example.dcm') img_array = ds.pixel_array ``` 2.使用OpenCV库对图像进行预处理,包括灰度化、二值化、滤波等操作。 ```python import cv2 # 灰度化 gray = cv2.cvtColor(img_array, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY) # 中值滤波 median = cv2.medianBlur(binary, 5) ``` 3.使用OpenCV库进行图像分割,可以使用阈值分割、边缘检测等方法。 ```python # 阈值分割 ret, thresh = cv2.threshold(median, 127, 255, cv2.THRESH_BINARY) # 边缘检测 edges = cv2.Canny(median, 100, 200) ``` 4.对分割后的图像进行后处理,包括去噪、填充、连通域分析等操作。 ```python # 去噪 kernel = np.ones((3, 3), np.uint8) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) # 填充 sure_bg = cv2.dilate(opening, kernel, iterations=3) sure_fg = cv2.erode(sure_bg, kernel, iterations=2) unknown = cv2.subtract(sure_bg, sure_fg) # 连通域分析 ret, markers = cv2.connectedComponents(sure_fg) ``` 5.使用分割结果进行后续处理,例如提取感兴趣区域、计算面积等操作。 ```python # 提取感兴趣区域 img, contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] x, y, w, h = cv2.boundingRect(cnt) roi = img_array[y:y+h, x:x+w] # 计算面积 area = cv2.contourArea(cnt) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-Leung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值