使用从图像欧拉数的相关性获得的自动调谐阈值来提取二值图像

时间:2017-01-19 10:40:24

标签: python opencv image-processing eulers-number

我试图使用-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

在翻译代码时,我遇到了以下问题:

  • 使用Python中的OpenCV计算图像的Euler数 - 我尝试使用" findContours"来实现这一点。 OpenCV中的方法但是没有得到满意的结果。

我已在下面附上我的代码。对于同样的评论,我将不胜感激。

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实现算法获得的结果
  • 使用上述算法进行工作的论文的PDF。他们的结果可以在论文的图4中看到。

尽管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'以及计算欧拉数的正确实现。

0 个答案:

没有答案