Подтвердить что ты не робот

Как выбрать наилучший набор параметров в алгоритме обнаружения Canny Edge, реализованном в openCV?

Я работаю с openCV на платформе Android. С огромной помощью этого сообщества и техников, я могу успешно обнаружить лист из изображения.       Это шаг, который я использовал.

1.Imgproc.cvtColor()
 2.Imgproc.Canny()
 3.Imgproc.GausianBlur()
 4.Imgproc.findContours()
 5.Imgproc.approxPolyDP()
 6.findLargestRectangle()
 7.find the vertices of the rectangle
 8.find the vertices of the rectangle top-left anticlockwise order using center of mass approach
 9.find the height and width of the rectangle just to maintain the aspect ratio and do warpPerspective transformation.

После применения всех этих шагов я могу легко получить документ или самый большой прямоangularьник из изображения. Но это сильно зависит от разницы в интенсивности фона и листа документа. Поскольку Canny edge работает по принципу градиента интенсивности, разница в интенсивности всегда предполагается со стороны реализации. Вот почему Canny учел различные пороговые параметры.

  1. Нижняя Тершольд
  2. Хейгер Тершольд

Поэтому, если градиент интенсивности пикселя больше, чем верхний порог, он будет добавлен в качестве граничного пикселя в выходное изображение. Пиксель будет полностью отклонен, если его градиент интенсивности ниже нижнего порога. И если пиксель имеет интенсивность между нижним и верхним порогом, он будет добавлен в качестве граничного пикселя, только если он подключен к любому другому пикселю, значение которого больше, чем верхний порог.

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

Я много пробовал, вручную настраивая параметры, но не смог найти никакой связи, связанной со сценариями.

Надеюсь, я проясню свою точку зрения, и спасибо заранее

4b9b3361

Ответ 1

Вы можете рассчитать свои пороговые значения с помощью метода Otsu's

Код (Python) будет выглядеть следующим образом:

high_thresh, thresh_im = cv2.threshold(im, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
lowThresh = 0.5*high_thresh

Ответ 2

Используйте следующий фрагмент, который я получил из ЭТОТ БЛОГ:

v = np.median(gray_image)

#---- apply automatic Canny edge detection using the computed median----
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(gray_image, lower, upper)
cv2.imshow('Edges',edged)

Итак, что я здесь делаю?

Я принимаю медианное значение изображения серой шкалы. Значение сигмы 0,33 выбрано так, чтобы установить нижний и верхний пороговые значения. Значение 0.33 обычно используется статистиками для науки о данных. Поэтому он также рассматривается здесь.