Вы можете просто использовать методы порога, чтобы отделить бумагу от фона. Для демонстрации:
Считайте изображение и преобразуйте его в серый.
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)
Вы можете использовать функцию cv2.imwrite () для сохранения изображения. Надеюсь, что этот ответ удовлетворит ваш вопрос. Но имейте в виду, что этот метод не всегда будет работать, потому что мы сами оцениваем гистограмму и вручную выбираем значения порогов. Если вы хотите использовать более общий подход, попробуйте adaptive thresholding
или оцените значения гистограммы с помощью алгоритма. Желаем удачи.