Как по средним значениям пикселей на изображении найти тёмную линию?

Имеется несколько изображений, на каждом из них есть тёмная линия. Я пробую находить среднее значение всех пикселей на изображении и после находить всё что темнее. Однако, при изменении освещения диапазон значений этой линии смещается и я захватываю лишнее. Также не стоит предлагать cv2.HoughLines, так как на изображении могут присутствовать белый прямые линии. Вот код, который почти идеально подходит для первого изображения, но не подходит для второго и третьего. Как понять, какие необходимо использовать параметры для inRange?

import cv2

dst = cv2.imread("test1 (1).png")
dst = cv2.cvtColor(dst, cv2.COLOR_BGR2HSV)

average_color = tuple([dst[:, :, i].mean() for i in range(dst.shape[-1])])
print(average_color)
thresh = cv2.inRange(dst, (0,0,0), (average_color[0]+15, average_color[1]+15, average_color[2]+5))

cv2.imshow("tresh.jpg", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()

введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения


Ответы (1 шт):

Автор решения: Vlad Bandarenka

Ушёл от идеи поиска линии по цвету, использовал в итоге HoughLinesP. Если у кого будут идеи с цветом, то пишите

dst = cv2.imread("name.png")
dst2 = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
dst2 = cv2.Canny(dst, 50, 150, apertureSize=3)

lineLength = int(dst.shape[0] * 0.5)

lines = cv2.HoughLinesP(image=dst2, rho=1, theta=np.pi / 180,
                         threshold=100, minLineLength=lineLength,
                         lines=np.array([]), maxLineGap=100)

print(lines)
liner = [x[1] for i in lines for x in i]
g = liner.index(min(liner))

for x1, y1, x2, y2 in lines[g]:
    cv2.line(dst, (0, y1), (dst.shape[0], y2), (50, 180, 60), 7)
→ Ссылка