Как получить «линию» на расстоянии - преобразованное изображение, используя python и opencv - PullRequest
0 голосов
/ 15 января 2019

У меня есть небольшая проблема с проектом, над которым я сейчас работаю. Я успешно использовал преобразование расстояния (cv2.distanceTransform) на изображении. Теперь мне нужно получить яркую «линию» внутри контура (место, наиболее удаленное от контуров). У меня уже есть алгоритм, который делает это, но в результате есть некоторые ошибки, которые я хотел бы исправить. Пока не знаю как. Я использую python, opencv и PyCharm.

Расстояние изображения:

enter image description here

Я пробовал несколько форм порога, хитрый и грубый (который не работает на изогнутых линиях, я думаю). Ни одна работа для моих нужд. Мой текущий код работает так. Я строю интервал, где я ищу пиксели с наибольшим значением. Значение этих пикселей установлено в 255. Я прохожу изображение дважды. Один раз начиная со строк и один раз начиная со столбцов. К сожалению, при таком подходе получаются пиксели, которые не принадлежат линии. Причина этого, конечно, в том, что используемые интервалы рассчитываются либо по строкам, либо по столбцам.

Результат:

enter image description here

Как вы можете видеть, это не последняя линия через контур. Это изображение я позже буду использовать в качестве маски для построения гистограммы.

def maxValueinIntervall(pathname, bounds, rowMax, colMax):
    img = cv2.imread(pathname, 0)
    res = np.zeros(img.shape, img.dtype)
    maxValue = 0
    kernel = np.ones((5, 5), np.uint8)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            if(img[i, j] == bounds and img[i, j + 1] > bounds and img[i, j - 1] <= bounds):
                n = 1
                k = j
                myList = []
                while(img[i, k + n ] > bounds):
                    myList.append(img[i, k + n])
                    k = n + k
                maxValue = max(myList)

            if (maxValue > rowMax and img[i, j] == maxValue):
                res[i, j] = 255

    for j in range(img.shape[1]):
        for i in range(img.shape[0]):
            if(img[i, j] == bounds and img[i + 1, j] > bounds and img[i - 1, j] <= bounds):
                n = 1
                k = i
                myList = []
                while(img[k + n, j] > bounds):
                    myList.append(img[k + n, j])
                    k = n + k
                maxValue = max(myList)

            if (maxValue > colMax and img[i, j] == maxValue):
                res[i, j] = 255

    return res

Может быть, уже есть функция opencv, которая делает это, чего я не нашел. Я надеюсь улучшить свое решение, чтобы получить лучшую маску для моего следующего шага. Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...