Скелетонизация с использованием Thinning и Hit-or-Miss никогда не останавливается - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь реализовать алгоритм скелетонизации с использованием метода прореживания / удара или пропуска, как описано в https://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm.

Я хочу извлечь скелет из следующего изображения, котороеЯ считаю, что это хорошее изображение для теста:

https://github.com/TiagoB936/Image-Processing-and-Computer-Vision/blob/master/Skeletonization/x.png

Проблема в том, что мой код не может перестать работать, и я не обнаружил проблему.

Мой код выполняет следующие действия:

  • Считывает изображение и преобразует его в двоичную форму
  • Создает 2 основных ядра:

    [[0,0,0]

    [- 1,1, -1]

    [1,1,1]]

    и

    [[- 1,0, 0]

    [1,1,0]

    [- 1,1,1]]

  • Создает еще 6 ядер, каждое из которыхповороты на 90 градусов основных ядер

  • Применяет попадание или пропуск создания 8 выходных изображений
  • Добавляет эти изображения и вычитает результат входного изображения, генерируя выходное изображение
  • Убедитесь, что выходное изображение равно входному изображению
  • Входное значение iмаг превращается в выходное изображение
  • Повторите, пока нет разницы между входным и выходным изображениями

Вот несколько тестовых кодов:

import cv2 as cv
import numpy as np

input_image = cv.imread('x.png',0)
_,input_image = cv.threshold(input_image,60,255,cv.THRESH_BINARY)

kernel1 = np.array((
        [0, 0, 0],
        [-1, 1, -1],
        [1, 1, 1]), dtype="int")
kernel2 = np.array((
        [-1, 0, 0],
        [1, 1, 0],
        [-1, 1, -1]), dtype="int")
kernel3 = np.rot90(kernel1)
kernel4 = np.rot90(np.rot90(kernel1))
kernel5 = np.rot90(np.rot90(np.rot90(kernel1)))
kernel6 = np.rot90(kernel2)
kernel7 = np.rot90(np.rot90(kernel2))
kernel8 = np.rot90(np.rot90(np.rot90(kernel2)))


output_image_1 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel1)
output_image_2 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel2)
output_image_3 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel3)
output_image_4 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel4)
output_image_5 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel5)
output_image_6 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel6)
output_image_7 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel7)
output_image_8 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel8)
hit_miss = output_image_1 + output_image_2 + output_image_3 + output_image_4 + output_image_5 + output_image_6 + output_image_7 + output_image_8
output_image = input_image - hit_miss

while not np.array_equal(output_image, input_image):
    input_image = output_image
    output_image_1 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel1)
    output_image_2 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel2)
    output_image_3 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel3)
    output_image_4 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel4)
    output_image_5 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel5)
    output_image_6 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel6)
    output_image_7 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel7)
    output_image_8 = cv.morphologyEx(input_image, cv.MORPH_HITMISS, kernel8)
    hit_miss = output_image_1 + output_image_2 + output_image_3 + output_image_4 + output_image_5 + output_image_6 + output_image_7 + output_image_8
    output_image = input_image - hit_miss

    cv.imshow("hit_miss", hit_miss)
    cv.imshow("out", output_image)  
    cv.waitKey(0)
    cv.destroyAllWindows()

Я быложидая получить тонкое X-изображение из моего ввода, но код не может перестать работать. Я что-то упустил?

1 Ответ

0 голосов
/ 16 ноября 2019

Вы хотите использовать логическое или после применения всех ядер вместо простого их добавления.

import cv2 as cv
import numpy as np

img = cv.imread('x.png',0)
_,img = cv.threshold(img,60,255,cv.THRESH_BINARY)

cv.imshow("input", img)  
cv.waitKey(0)
cv.destroyAllWindows()

kernel1 = np.array((
        [[-1, -1, -1],
        [0, 1, 0],
        [1, 1, 1]]))
kernel2 = np.array((
        [[0, -1, -1],
        [1, 1, -1],
        [0, 1, 0]]))

kernel3 = np.rot90(kernel1)
kernel4 = np.rot90(kernel2)
kernel5 = np.rot90(np.rot90(kernel1))
kernel6 = np.rot90(np.rot90(kernel2))
kernel7 = np.rot90(np.rot90(np.rot90(kernel1)))
kernel8 = np.rot90(np.rot90(np.rot90(kernel2)))
skel = np.zeros(img.shape,np.uint8)
mask = np.zeros(img.shape,np.uint8)
kernels = [kernel1, kernel2, kernel3, kernel4, kernel5, kernel6, kernel7, kernel8]

while (1):
    mask = np.zeros(img.shape,np.uint8)

    for kernel in kernels:
        out_image = cv.morphologyEx(img, cv.MORPH_HITMISS, kernel)
        mask = cv.bitwise_or(out_image, mask)

    img = img - mask

    if (np.array_equal(img, skel)):
        break

    skel = img

cv.imshow("out", img)  
cv.waitKey(0)
cv.destroyAllWindows()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...