Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 利用图像欧拉数相关性自动调整阈值提取二值图像_Python_Opencv_Image Processing_Eulers Number - Fatal编程技术网

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”方法实现这一点,但没有得到令人满意的结果 我在下面附上了我的代码。如果您能就此发表任何

我正试图用L.p Wong,H.T Ewe中描述的方法从胸部x光图像中提取肺部区域。“利用胸部X光图像检测肺癌的研究”。2005年1月27日至28日在马来西亚吉隆坡举行的第三届APT远程医疗研讨会。第210-214页。我试图在Python中复制的代码就在这里-

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


  • 在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中看到
虽然Octave所获得的结果并不像本文中描述的那样“清晰”,但这种质量水平正是我第一次尝试通过Python实现的。在尝试调试代码的基础上,我发现了以下问题:

  • 如果我将“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的要求上传了我正在处理的图像。“没有得到满意的结果”是毫无意义的。展示一些结果,解释你的期望和得到的结果,以及为什么会发生。有自己的想法吗?任何地面真相图片都会有帮助!我为这个不完整的问题道歉。我对它进行了编辑,以提供尽可能多的细节,并试图概述我的方法以及代码中的特定错误。