обнаружение грубых линий на целостном вложенном обрамленном изображении - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь получить грубые линии для обнаружения документов с помощью HED (целостное вложение краев), но не получаю правильные линии для определения документов.

Изображение с грубыми линиями: image with hough lines

Код:

lines = cv2.HoughLines(out,1,np.pi/180,200,np.array([]),0,0)
for line in lines:
    rho=line[0][0]
    theta = line[0][1];
    a = np.cos(theta);
    b = np.sin(theta);
    x0 = a*rho; y0 = b*rho;
    x1 = np.round(x0 + 1000*(-b));
    y1 = np.round(y0 + 1000*(a));
    x2 = np.round(x0 - 1000*(-b));
    y2 = np.round(y0 - 1000*(a));
    cv2.line(original,(int(x1),int(y1)), (int(x2),int(y2)),(0,0,255), 3)

Hed-изображение: hed image

Исходное изображение: original image

1 Ответ

0 голосов
/ 27 сентября 2019

Вы можете использовать следующий подход, если ваша цель - определить область белой книги.Здесь пороговое значение на изображении HED сначала применяется для генерации двоичного изображения, а также для уменьшения шума.После этого, применение HoughLinesP к двоичным линиям изображения HED обнаруживается.Обратите внимание, что параметры (например, minLineLength) HoughLinesP настроены для этого размера изображения.

hed_binary = cv2.threshold(hed, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]  # holistically nested edge image is in gray scale
lines = cv2.HoughLinesP(hed_binary, rho=1, theta=1*np.pi/180, threshold=2300, minLineLength=1000, maxLineGap=10)
for i in range(lines.shape[0]):
    x1 = lines[i][0][0]
    y1 = lines[i][0][1]
    x2 = lines[i][0][2]
    y2 = lines[i][0][3]

    cv2.line(original, (x1, y1), (x2, y2), (0, 0, 255), 2)

Вывод этого подхода: enter image description here


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

gray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (7,7), 0)
binary = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnt = None
max_area = x = y = w = h = 0
for c in cnts:
    area = cv2.contourArea(c)
    if area > max_area:
        x, y, w, h = cv2.boundingRect(c)
        max_area = area
        cnt = c

cv2.drawContours(original, [cnt], 0, (0,  255, 0), 3)
cv2.rectangle(original, (x,y), (x+w, y+h), (255, 0, 0), 3)

Вывод: enter image description here

...