Проблема
То, что вы распечатываете, - это пиксельные координаты изображений, которые вы создаете в основном в черно-белых полосах.Они не имеют никакой информации о связности, связанной с ними, поэтому вы не должны предполагать, что два пикселя, которые находятся рядом в создаваемом вами списке, на самом деле имеют линию между ними.
Я думаю, что вас смущает тот факт, что np.nonzero
эффективно сортирует данные, которые вы печатаете.Под «сортировкой» я подразумеваю, что его возвращаемое значение всегда будет содержать сначала индексы ненулевых значений в 0
-й строке, затем ненулевые значения в 1
-й строке и т. Д.
Думайте об этом, как о старом ЭЛТ-мониторе (если вы достаточно взрослый, чтобы знать, что это такое): nonzero
сканирует изображение по горизонтали, последовательно захватывая пиксели из линий, параллельных одной.другое, не подключенное.
Решение
Вы можете дополнительно обрабатывать изображения вертикальных и горизонтальных линий, чтобы получить нужные линии.Следуя инструкциям, которые я нашел здесь , я сделал следующее изображение, найдя и затем нарисовав отрезки линий на исходном газетном изображении:
![enter image description here](https://i.stack.imgur.com/8dmO0.jpg)
Вот код, который я использовал (который основан на том, где останавливается ваш код):
img = src.copy()
# edges = cv.Canny(vertical,50,150,apertureSize = 3)
minLineLength = 100
maxLineGap = 200
lines = cv.HoughLinesP(vertical,1,np.pi/180,100,minLineLength,maxLineGap)
for line in lines:
for x1,y1,x2,y2 in line:
cv.line(img,(x1,y1),(x2,y2),(0,255,0),2)
cv.imwrite('houghlinesP_vert.jpg', img)