Python 利用图像欧拉数相关性自动调整阈值提取二值图像
我正试图用L.p Wong,H.T Ewe中描述的方法从胸部x光图像中提取肺部区域。“利用胸部X光图像检测肺癌的研究”。2005年1月27日至28日在马来西亚吉隆坡举行的第三届APT远程医疗研讨会。第210-214页。我试图在Python中复制的代码就在这里- 在翻译代码时,我遇到了以下问题:Python 利用图像欧拉数相关性自动调整阈值提取二值图像,python,opencv,image-processing,eulers-number,Python,Opencv,Image Processing,Eulers Number,我正试图用L.p Wong,H.T Ewe中描述的方法从胸部x光图像中提取肺部区域。“利用胸部X光图像检测肺癌的研究”。2005年1月27日至28日在马来西亚吉隆坡举行的第三届APT远程医疗研讨会。第210-214页。我试图在Python中复制的代码就在这里- 在翻译代码时,我遇到了以下问题: 在Python中使用OpenCV计算图像的Euler数——我曾尝试在OpenCV中使用“findContours”方法实现这一点,但没有得到令人满意的结果 我在下面附上了我的代码。如果您能就此发表任何
- 在Python中使用OpenCV计算图像的Euler数——我曾尝试在OpenCV中使用“findContours”方法实现这一点,但没有得到令人满意的结果
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('chest.jpg',cv2.CV_LOAD_IMAGE_GRAYSCALE)
a = cv2.equalizeHist(img)
b = 255
arr_b = [i for i in range(b)]
trans_thresh = [float(i)/float(b) for i in arr_b]
result4_trans1 = []
def euler_number(image):
contours, hierarchy = cv2.findContours(a,cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
objects = len(contours)
holes = 0
for h in hierarchy[0]:
if h[2] == -1:
holes += 1
eulerNumber = objects - holes
return eulerNumber
def convert_to_binary_image(image, threshold, maxVal):
ret, thresh = cv2.threshold(image, threshold, maxVal, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
return thresh
for j in range(b):
value_trans1 = trans_thresh[j]
binary_image = convert_to_binary_image(a, value_trans1, b)
result4_trans1.append(euler_number(binary_image))
max_result4_trans1 = max(result4_trans1)
min_result4_trans1 = min(result4_trans1)
m = 0
n = 0
max_sum_result4_trans1 = 0
min_sum_result4_trans1 = 0
for j in range(b):
if result4_trans1[j] == max_result4_trans1:
m += 1
max_sum_result4_trans1 += j
elif result4_trans1[j] == min_result4_trans1:
n += 1
min_sum_result4_trans1 += j
threshold_I1 = (float(max_sum_result4_trans1)+float(min_sum_result4_trans1))/float(m+n)
c = convert_to_binary_image(a, threshold_I1/float(b+1), b)
plt.imshow(c, cmap='gray')
plt.show()
编辑:可以查看我使用过的图像和我获得的图像。该文件夹包含以下内容:
- 原始图像
- 在倍频程中实现该算法得到的结果
- 在Python中实现该算法得到的结果
- 使用上述算法进行工作的论文的PDF。他们的结果可以在论文的图4中看到
- 如果我将“convert_to_binary_image”作为一个独立函数调用以进行测试,例如
plt.imshow(将图像转换为二值图像(a,trans\u thresh[1],b),cmap='gray')
for j in range(b):
value_trans1 = trans_thresh[j]
binary_image = convert_to_binary_image(a, value_trans1, b)
result4_trans1.append(euler_number(binary_image))
此迭代中显示的图像与测试时显示的图像不一致,并且与获得的最终图像相似(上面给出的链接)
- 在试图计算欧拉数时,我尝试了两种方法——一种是在OpenCV中使用“findContours”,另一种是在skimage中使用“regionprops”。我从两者得到的结果是不同的(OpenCV为1,Skipage为55)。使用略读的方法是
region=regionprops(标签(图4)) e=0 对于区域内的r: e+=r.euler_数 返回e
我非常感谢您对上述两个问题的评论-为“转换为二进制图像”绘制的图像的不稳定性以及计算欧拉数的正确实现。您能上传您正在处理的图像吗?我还按照Jeru Luke的要求上传了我正在处理的图像。“没有得到令人满意的结果“这是毫无意义的。展示一些结果,解释你的期望和得到的结果,以及为什么会发生。有自己的想法吗?任何地面真相图片都会有帮助!我为这个不完整的问题道歉。我编辑了它以提供尽可能多的细节,并试图概述我的方法以及代码中的特定错误。你能上传你正在处理的图像吗?我还按照Jeru Luke的要求上传了我正在处理的图像。“没有得到满意的结果”是毫无意义的。展示一些结果,解释你的期望和得到的结果,以及为什么会发生。有自己的想法吗?任何地面真相图片都会有帮助!我为这个不完整的问题道歉。我对它进行了编辑,以提供尽可能多的细节,并试图概述我的方法以及代码中的特定错误。