как подогнать линии к краям и найти центральную точку (opencv)

У меня есть изображение, к которому я применяю двусторонний фильтр, а затем адаптивную пороговую обработку, чтобы получить изображение ниже.

исходное изображение (это снимок экрана с изображением глубины объекта)  введите описание изображения здесь

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

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

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

Я не могу понять вывод cv2.ad а>. Как представлены фиолетовые пиксели (т.е. мои края)? и как можно подогнать линию? MWE:

import cv2

image = cv2.imread("depth_frame0009.jpg")
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

bilateral_filter = cv2.bilateralFilter(gray_image, 15, 50, 50)
plt.figure()
plt.imshow(bilateral_filter)
plt.title("bilateral filter")
#plt.imsave("2dimage_gaussianFilter.png",blurred)
plt.imsave("depthmap_image_bilateralFilter.png",bilateral_filter)


th3 = cv2.adaptiveThreshold(bilateral_filter,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
plt.figure()
plt.imshow(th3)

========

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

Резкие края  введите здесь описание изображения контуры  введите описание изображения здесь


person Drak    schedule 29.07.2020    source источник


Ответы (1)


Они представлены в виде изображения, матрицы uint8.

Причина, по которой он пурпурный и желтый, заключается в том, что matplotlib применяет к нему цветовую карту.

Обычно я предпочитаю использовать некоторые конкретные параметры при построении изображений для обработки изображений, например

plt.imshow(th3, cmap='gray', interpolation='nearest')

Если вас особенно интересует поиск и подгонка линий, вы можете использовать другое представление, например Грубые строки. Когда у вас есть линии на изображении, вы можете выбрать наиболее подходящие линии и найти свою центральную точку между ними.

person shortcipher3    schedule 29.07.2020
comment
теперь он выглядит бело-черным (вместо пурпурного и желтого). Применение коротких линий к выходным данным AdaptiveThreshold не работает, только одна диагональная линия проходит через все изображение. Попытка выполнить грубые строки на выходе cv2.Canny () может обнаружить только горизонтальную линию - person Drak; 30.07.2020
comment
Я бы сделал линии Хафа на исходном изображении. - person shortcipher3; 30.07.2020
comment
Не думаю, что это сработает. В документации houghlines () Они делают это после того, как получают острые углы Canny. Я устал от исходного серого изображения, adaptiveThreshold, но во всех случаях houglines () не работает. Только когда я использую острые края в качестве входных данных, он обнаруживает только горизонтальную линию:! hough_lines_image. - person Drak; 03.08.2020
comment
Совместное использование исходного изображения было бы более полезным для поиска работающего решения. - person shortcipher3; 03.08.2020