我试图使用-L.P Wong,H.T Ewe。中描述的方法从胸部X射线图像中提取肺部区域。 "使用胸部X射线图像检测肺癌的研究" 2005年1月27日至28日在马来西亚吉隆坡举行的第三届APT远程医疗研讨会。第210-214页。我在Python中复制的代码是http://www.mathworks.com/matlabcentral/mlc-downloads/downloads/submissions/12543/versions/1/previews/EulerMinMax.m/index.html。
在翻译代码时,我遇到了以下问题:
我已在下面附上我的代码。对于同样的评论,我将不胜感激。
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()
修改:可以查看我使用的图像和我获得的图像here。该文件夹包含以下内容:
尽管Octave获得的结果不是那么清楚。正如本文所描述的那样,质量水平是我首先尝试通过Python实现的。基于尝试调试代码,我发现了以下问题:
< convert_to_binary_image'如果我将其称为独立函数来测试,例如
,则会提供正确的结果 plt.imshow(convert_to_binary_image(a, trans_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))
此迭代中显示的图像与测试时显示的图像不一致,并且与获得的最终图像相似(上面给出的链接)。
在尝试计算欧拉数时,我尝试了两种方法 - 一种使用' findContours'在OpenCV和另一个使用' regionprops'在 skimage 。我从两者得到的结果是不同的(OpenCV为1,滑雪为55)。使用skimage的方法是
region = regionprops(label(image, 4))
e = 0
for r in region:
e += r.euler_number
return e
我非常感谢上述两个问题的评论 - 图像的不稳定性为< convert_to_binary_image'以及计算欧拉数的正确实现。