Преобразовать красную линию на изображении в список - PullRequest
0 голосов
/ 08 октября 2018

Я хочу измерить разницу высот относительно земли обнаруженного объекта в этой трубе.Нижняя красная линия должна быть маркером минимальной высоты.Я думал, что мог бы сначала преобразовать нижнюю красную линию в пустой список, но как мне это сделать?Красные круги нарисованы с помощью функции cv2.circle().

enter image description here

Редактировать:

Благодаря ZdaR IЯ ближе к решению моей проблемы.Это его решение, переписанное для работы с python3:

import cv2
import numpy as np


def get_center(arr):
    return sum(arr)/len(arr)


def get_cluster_centers(arr, tolerance):
    clusters = [[arr[0]]]

    for ele in arr[1:]:
        if abs(clusters[-1][0] - ele) < tolerance:
            clusters[-1].append(ele)
        else:
            clusters.append([ele])

    clusters_centers = map(get_center, clusters)
    return clusters_centers


img = cv2.imread("/home/artur/Desktop/0.png")

# Segment the red color
mask = cv2.inRange(img, np.array([0, 0, 255]), np.array([0, 0, 255]))

for i in mask:
    print(i)

# Let's iterate the middle column and get the distance between the two red lines.
half_width = int(mask.shape[1]/2)
middle_column = mask[:, half_width]

idx = np.where(middle_column == 255)

# Since the width of line is not 1 px so we need to cluster the pixels to get a single center value.
centers = list(get_cluster_centers(idx[0], 5))

if len(centers) == 2:
    print("Distance between lines:", centers[1] - centers[0], "px")

Он измеряет расстояние в пикселях между верхней и нижней красной линией с помощью среднего столбца изображения.Как бы я перебрал все столбцы, чтобы определить минимальное расстояние между этими двумя линиями или лучше между обнаруженным объектом и нижней красной линией?Правильно ли я понимаю, что это решение учитывает только средний столбец?

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете сначала сегментировать красный цвет от входного изображения, чтобы получить двоичную маску, а затем, предполагая, что ваша красная линия отцентрирована относительно входного изображения, мы берем центральный столбец этого изображения и перебираем столбец, чтобы найти красную точкуЗатем местоположения просто найдите расстояние в пикселях как:

import cv2
import numpy as np


def get_center(arr):
    return sum(arr)/len(arr)


def get_cluster_centers(arr, tolerance):
    clusters = [[arr[0]]]

    for ele in arr[1:]:
        if abs(clusters[-1][0] - ele) < tolerance:
            clusters[-1].append(ele)
        else:
            clusters.append([ele])

    clusters_centers = map(get_center, clusters)
    return clusters_centers


img = cv2.imread("/home/anmol/Downloads/HK3WM.png")

# Segment the red color
mask = cv2.inRange(img, np.array([0, 0, 255]), np.array([0, 0, 255]))

# Let's iterate the middle column and get the distance between the two red lines.
half_width = mask.shape[1]/2
middle_column = mask[:, half_width]

idx = np.where(middle_column == 255)

# Since the width of line is not 1 px so we need to cluster the pixels to get a single center value.
centers = get_cluster_centers(idx[0], 5)

if len(centers) == 2:
    print "Distance between lines:", centers[1] - centers[0], "px"

PS: Я очень спешу, если это не объясняет что-то, не стесняйтесь спрашивать в комментариях.

...