Как по средним значениям пикселей на изображении найти тёмную линию?
Имеется несколько изображений, на каждом из них есть тёмная линия. Я пробую находить среднее значение всех пикселей на изображении и после находить всё что темнее. Однако, при изменении освещения диапазон значений этой линии смещается и я захватываю лишнее. Также не стоит предлагать 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)


