Улучшение обнаружения Canny Edge - PullRequest
1 голос
/ 06 мая 2020

Когда я запускаю детектор краев cv.Canny на чертежах, он обнаруживает сотни маленьких краев, плотно расположенных в затененных областях. Как я могу заставить его прекратить это делать, при этом обнаруживая более светлые черты, такие как глаза и нос? Я тоже пробовал размытие.

Вот пример в сравнении с онлайн-инструментом для фото .

Исходное изображение .
Вывод онлайн-инструмента .
Моя python программа

Вот мой код:

def outline(image, sigma = 5):
    image = cv.GaussianBlur(image, (11, 11), sigma)
    ratio = 2
    lower = .37 * 255
    upper = lower * ratio
    outlined = cv.Canny(image, lower, upper)

    return outlined

Как я могу его улучшить?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Вот один из способов сделать это в Python / OpenCV.

Morphologi c edge out - абсолютная разница между маской и расширенной маской

  • Прочитать ввод
  • Преобразовать в серый
  • Порог (как маска)
  • Увеличить изображение с пороговым значением
  • Вычислить абсолютную разницу
  • Инвертировать полярность изображения края
  • Сохранить результат

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread("cartoon.jpg")

# convert to gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold
thresh = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY)[1]

# morphology edgeout = dilated_mask - mask
# morphology dilate
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
dilate = cv2.morphologyEx(thresh, cv2.MORPH_DILATE, kernel)

# get absolute difference between dilate and thresh
diff = cv2.absdiff(dilate, thresh)

# invert
edges = 255 - diff

# write result to disk
cv2.imwrite("cartoon_thresh.jpg", thresh)
cv2.imwrite("cartoon_dilate.jpg", dilate)
cv2.imwrite("cartoon_diff.jpg", diff)
cv2.imwrite("cartoon_edges.jpg", edges)

# display it
cv2.imshow("thresh", thresh)
cv2.imshow("dilate", dilate)
cv2.imshow("diff", diff)
cv2.imshow("edges", edges)
cv2.waitKey(0)


Изображение с пороговым значением:

enter image description here

Изображение расширенного порога:

enter image description here

Различное изображение:

enter image description here

Изображение края:

enter image description here

1 голос
/ 10 мая 2020

Мне удалось заставить cv.Canny давать удовлетворительные результаты, изменив размер ядра с (11, 11) на (0, 0), что позволило ядру динамически определять сигму. Сделав это и настроив сигму, я получил довольно хорошие результаты. Кроме того, cv.imshow искажает изображения, поэтому, когда я использовал его для тестирования, результаты выглядели значительно хуже, чем были на самом деле.

...