Извлечение двоичного изображения из автоматически настраиваемых пороговых значений, полученных из корреляции чисел Эйлера изображения

Я пытаюсь извлечь область легких из рентгеновских снимков грудной клетки, используя метод, описанный в - LP Wong, HT Ewe. "Исследование выявления рака легких с использованием рентгенограмм грудной клетки". 3-й семинар по телемедицине APT 2005, 27-28 января 2005 года, Куала-Лумпур, Малайзия. Страницы 210-214. Код, который я пытаюсь воспроизвести в Python, представлен здесь - http://www.mathworks.com/matlabcentral/mlc-downloads/downloads/submissions/12543/versions/1/previews/EulerMinMax.m/index.html.

При переводе кода я столкнулся со следующими проблемами:

  • Вычисление числа Эйлера для изображений с использованием OpenCV в Python - я пытался реализовать это с помощью метода "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()

Изменить: Изображения, которые я использовал, и те, которые я получил, можно посмотреть здесь. Папка содержит следующее:

  • Исходное изображение
  • Результат, полученный при реализации алгоритма в 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. Результаты, которые я получил от обоих, были разными (1 для OpenCV и 55 для лыжного мага). Подход с использованием лыжного мага

    region = regionprops(label(image, 4)) e = 0 for r in region: e += r.euler_number return e

Я был бы очень признателен за комментарии, касающиеся двух вышеупомянутых проблем - нестабильности изображений, отображаемых для 'convert_to_binary_image', и правильной реализации для вычисления числа Эйлера.

0 ответов

Другие вопросы по тегам