Получить координаты линии для вертикальных линий - PullRequest
0 голосов
/ 18 декабря 2018

Я обнаружил горизонтальные и вертикальные линии на этом снимке:

enter image description here

enter image description here

enter image description here

с использованием этого кода:

import numpy as np
import cv2 as cv

src = cv.imread("filename.png", cv.IMREAD_COLOR)

if len(src.shape) != 2:
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
else:
    gray = src

gray = cv.bitwise_not(gray)
bw = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 15, -2)

horizontal = np.copy(bw)
vertical = np.copy(bw)

cols = horizontal.shape[1]
horizontal_size = int(cols / 30)

horizontalStructure = cv.getStructuringElement(cv.MORPH_RECT, (horizontal_size, 1))
horizontal = cv.erode(horizontal, horizontalStructure)
horizontal = cv.dilate(horizontal, horizontalStructure)

#np.set_printoptions(threshold=np.inf)
cv.imwrite("img_horizontal8.png", horizontal)

h_transpose = np.transpose(np.nonzero(horizontal))
print("h_transpose")
print(h_transpose[:100])
#prints [ 56  35] ... [ 56  134]
#and that makes sense, there is an horizontal line more or less in the height 56 like that on the image img_horizontal8.png



rows = vertical.shape[0]
verticalsize = int(rows / 30)
verticalStructure = cv.getStructuringElement(cv.MORPH_RECT, (1, verticalsize))
vertical = cv.erode(vertical, verticalStructure)
vertical = cv.dilate(vertical, verticalStructure)

cv.imwrite("img_vertical8.png", vertical)

v_transpose = np.transpose(np.nonzero(vertical))

print("v_transpose")
print(v_transpose[:100])

prints:

 [  68  489]
 [  68  490]
 [  69  489]
 [  69  490]
 [  69  721]
 [  70  489]
 [  70  490]
 [  70  721]
 [  71  489]
 [  71  490]
 [  71  721]
 [  71  950]
 [  72  489]
 [  72  490]
 [  72  721]
 [  72  950]
 [  73  489]
 [  73  490]
 [  73  721]
 [  73  950]
 [  74  489]
 [  74  490]
 [  74  721]
 [  74  950]
 [  75  489]
 [  75  490]
 [  75  721]
 [  75  950]
 [  75 1179]
 [  75 1410]
 [  76  489]
 [  76  490]
 [  76  721]
 [  76  950]
 [  76 1178]
 [  76 1179]
 [  76 1410]
 [  77  489]
 [  77  490]
 [  77  721]
 [  77  950]
 [  77 1178]
 [  77 1179]
 [  77 1410]
 [  78  489]
 [  78  490]
 [  78  721]
 [  78  950]
 [  78 1178]
 [  78 1179]
 [  78 1410]

Неужели я что-то неправильно понимаю относительно получения координат для вертикальных линий?Печатные результаты, кажется, показывают, что у нас есть линия от 68 489 до 68 490 (строка длиной 1), а затем множество других очень коротких линий до точки, где х = 78.Но на изображении img_vertical8.png не видно слишком коротких линий, поэтому я не понимаю, что происходит.Эти массивы для вертикальных линий могут быть неправильными по какой-то причине?Есть идеи?

1 Ответ

0 голосов
/ 18 декабря 2018

Проблема

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

Я думаю, что вас смущает тот факт, что np.nonzero эффективно сортирует данные, которые вы печатаете.Под «сортировкой» я подразумеваю, что его возвращаемое значение всегда будет содержать сначала индексы ненулевых значений в 0-й строке, затем ненулевые значения в 1-й строке и т. Д.

Думайте об этом, как о старом ЭЛТ-мониторе (если вы достаточно взрослый, чтобы знать, что это такое): nonzero сканирует изображение по горизонтали, последовательно захватывая пиксели из линий, параллельных одной.другое, не подключенное.

Решение

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

enter image description here

Вот код, который я использовал (который основан на том, где останавливается ваш код):

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...