Идея состоит в пороговом значении изображения для получения двоичного изображения, а затем нахождения контуров и сортировки с использованием области контура. Наибольшим контуром должна быть учетная карточка. Затем мы можем применить четырехточечное перспективное преобразование , чтобы получить изображение с высоты птичьего полета. Вот результаты:
Двоичное изображение
![enter image description here](https://i.stack.imgur.com/wvg6e.png)
Результат
![enter image description here](https://i.stack.imgur.com/FsNEs.jpg)
Результат темный, поэтому для повышения контрастности посмотрите на Automati c Настройка контрастности и яркости цветной фотографии на листе бумаги с помощью OpenCV . Кроме того, он немного искажен, поэтому вы должны выполнить коррекцию перекоса. Взгляните на Python Коррекция перекоса OpenCV , Как отменить перекос изображения и Определить угол ориентации изображения на основе направления текста
Я оставлю вам эти шаги:)
Код
from imutils.perspective import four_point_transform
import cv2
import numpy
# Load image, grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread("1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
# Find contours and sort for largest contour
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
displayCnt = None
for c in cnts:
# Perform contour approximation
peri = cv2.arcLength(c, True)
approx = cv2.approxPolyDP(c, 0.02 * peri, True)
if len(approx) == 4:
displayCnt = approx
break
# Obtain birds' eye view of image
warped = four_point_transform(image, displayCnt.reshape(4, 2))
cv2.imshow("thresh", thresh)
cv2.imshow("warped", warped)
cv2.imshow("image", image)
cv2.imwrite("thresh.png", thresh)
cv2.imwrite("warped.png", warped)
cv2.imwrite("image.png", image)
cv2.waitKey()