gpt4 book ai didi

python - Python:计算X射线中两 block 骨头之间的角度

转载 作者:行者123 更新时间:2023-12-02 17:08:27 25 4
gpt4 key购买 nike

我正在尝试编写脚本来计算给定X射线的两个骨骼之间的 Angular 。

X射线样本如下所示:

Sample x-ray

我正在尝试计算每个骨骼的中线,基本上是沿着骨骼两侧的中点的一条线,然后比较两条中线之间的 Angular 。

我尝试使用OpenCV来获取骨骼的轮廓,但它似乎不够准确,并且会获取大量额外数据。我被困在下一步如何移动以及如何计算中线。我对图像处理很陌生,但是有使用Python的经验。

使用OpenCV获得优势:

enter image description here

OpenCV的代码:

import cv2

# Load the image
img = cv2.imread("xray-3.jpg")

# Find the contours
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(img,60,200)
im2, contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

hierarchy = hierarchy[0] # get the actual inner list of hierarchy descriptions

# For each contour, find the bounding rectangle and draw it
cv2.drawContours(img, contours, -1, (0,255,0), 3)

# Finally show the image
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

最佳答案

如果没有作弊,我建议裁剪图像,使其不包含尽可能多的标签和比例,而不会删除任何感兴趣的区域。

话虽如此,我认为如果对图像进行一些预处理,则可以使用获得轮廓的方法。可能会达到目的的一种算法是Difference of Gaussians(DoG)过滤器,该过滤器将使边缘更加明显。我稍微修改了this code,它将使用一些不同的sigma和k值来计算DoG滤波器。

from skimage import io, feature, color, filters, img_as_float
from matplotlib import pyplot as plt

raw_img = io.imread('xray-3.jpg')
original_image = img_as_float(raw_img)
img = color.rgb2gray(original_image)

k = 1.6

plt.subplot(2,3,1)
plt.imshow(original_image)
plt.title('Original Image')

for idx,sigma in enumerate([4.0, 8.0, 16.0, 32.0]):
s1 = filters.gaussian(img, k*sigma)
s2 = filters.gaussian(img, sigma)

# multiply by sigma to get scale invariance
dog = s1 - s2
plt.subplot(2,3,idx+2)
print("min: {} max: {}".format(dog.min(), dog.max())
plt.imshow(dog, cmap='RdBu')
plt.title('DoG with sigma=' + str(sigma) + ', k=' + str(k))

ax = plt.subplot(2, 3, 6)
blobs_dog = [(x[0], x[1], x[2]) for x in feature.blob_dog(img, min_sigma=4, max_sigma=32, threshold=0.5, overlap=1.0)]
# skimage has a bug in my version where only maxima were returned by the above
blobs_dog += [(x[0], x[1], x[2]) for x in feature.blob_dog(-img, min_sigma=4, max_sigma=32, threshold=0.5, overlap=1.0)]

#remove duplicates
blobs_dog = set(blobs_dog)

img_blobs = color.gray2rgb(img)
for blob in blobs_dog:
y, x, r = blob
c = plt.Circle((x, y), r, color='red', linewidth=2, fill=False)
ax.add_patch(c)
plt.imshow(img_blobs)
plt.title('Detected DoG Maxima')

plt.show()

enter image description here

乍一看,似乎sigma = 8.0,k = 1.6可能是您最好的选择,因为这似乎最好地放大了小腿的边缘,同时消除了小腿上的噪音。特别是超过对象的左腿(右图)。再给您的边缘检测一次去尝试一下k和sigma,让我知道您得到了什么:)

如果结果看起来不错,您应该能够在图像的每一行中为任一条腿检测到的边缘之间得到一个中心点。然后,找到两条腿的中点最合适的线,您应该就很好了。您还需要将一条腿与另一条腿隔离开来,因此,如果它没有作弊,则可以将图像中间的部分裁剪为两张图像。

关于python - Python:计算X射线中两 block 骨头之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49743649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com