Обнаружение границ страницы на столе и затем «перефокусировка» - PullRequest
1 голос
/ 18 апреля 2020

У меня есть следующая картинка, и я хотел бы определить границу страницы, а затем перефокусироваться, чтобы увидеть «только» страницу. Как я могу начать кодировать это с opencv3 и Python 3?

enter image description here

1 Ответ

2 голосов
/ 24 апреля 2020

Вы можете просто использовать методы порога, чтобы отделить бумагу от фона. Для демонстрации:

Считайте изображение и преобразуйте его в серый.

image = cv2.imread("page.jpg")
gray_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

проверьте гистограмму, чтобы выбрать пороговые значения. Подробнее здесь

color = ('b','g','r')
fig = plt.figure(figsize=(12,12))
ax = fig.add_subplot(1,2,1)
ax.imshow(image)
ax1 = fig.add_subplot(1,2,2)
for i,col in enumerate(color):
    histogram = cv2.calcHist([image],[i],None,[256],[0,256])
    ax1.plot(histogram,color = col)
    ax1.set_xlim([0,256])

Используйте размытие, чтобы избавиться от деталей ноутбука.

blurred_gray_image = cv2.blur(gray_image,(21,21))

Выполните определение порога . Используя значения, которые мы получили из гистограммы.

_,thresholded_blurry_image = cv2.threshold(blurred_gray_image,165,255,cv2.THRESH_BINARY)

Обнаружение контуров (которые являются неразделенными, замкнутыми формами).

contours, hierarchy = cv2.findContours(thresholded_blurry_image,
cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

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

output = image.copy()
if len(contours) != 0:
    c = max(contours, key = cv2.contourArea)
    # coordinates of the contour
    x,y,w,h = cv2.boundingRect(c)
    cv2.rectangle(output,(x,y),(x+w,y+h),(0,255,0),2)

Показать результат

output = cv2.cvtColor(output,cv2.COLOR_BGR2RGB)
plt.imshow(output)

Output

Вы можете использовать функцию cv2.imwrite () для сохранения изображения. Надеюсь, что этот ответ удовлетворит ваш вопрос. Но имейте в виду, что этот метод не всегда будет работать, потому что мы сами оцениваем гистограмму и вручную выбираем значения порогов. Если вы хотите использовать более общий подход, попробуйте adaptive thresholding или оцените значения гистограммы с помощью алгоритма. Желаем удачи.

...