уменьшить форму изображения, удалив белизну вокруг - PullRequest
0 голосов
/ 04 мая 2020
from pdf2image import convert_from_path
import cv2,numpy,os
def pil_to_cv2(image):
    open_cv_image = numpy.array(image)
    return open_cv_image[:, :, ::-1].copy() 
images = convert_from_path('test.pdf')
cv_h=[pil_to_cv2(i) for i in images]
for img in cv_h:
    #function_to_crop()
    cv2.imwrite('modified.png', img)

Как я могу удалить лишнюю белизну с изображения (сверху, сбоку, снизу), фактически не перехватывая рисунок. Рисунки из pdf имеют разные размеры, поэтому я не могу обрезать изображения по фиксированному числу.

image

В идеале результат должен выглядеть следующим образом enter image description here

Ответы [ 2 ]

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

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

  • Считать изображение
  • Преобразовать в серый и инвертировать полярность
  • Порог
  • Примените морфологию близко к заполнению отверстий и сделайте одну solid область
  • Получите внешний контур и его ограничивающую рамку
  • Используйте ограничивающую рамку, чтобы обрезать изображение, используя Numpy нарезку
  • Сохранить результат

Ввод:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('multipower.png')

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

# invert gray image
gray = 255 - gray

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

# apply close and open morphology
kernel = np.ones((75,75), np.uint8)
mask = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# get contours (presumably just one around the nonzero pixels) 
contours = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
cntr = contours[0]
x,y,w,h = cv2.boundingRect(cntr)

# draw contour on input
contour_img = img.copy()
cv2.drawContours(contour_img,[cntr],0,(0,0,255),3)

# crop to bounding rectangle
crop = img[y:y+h, x:x+w]

# save cropped image
cv2.imwrite('multipower_thresh.png',thresh)
cv2.imwrite('multipower_mask.png',mask)
cv2.imwrite('multipower_contour.png',contour_img)
cv2.imwrite('multipower_cropped.png',crop)

# show the images
cv2.imshow("THRESH", thresh)
cv2.imshow("MASK", mask)
cv2.imshow("CONTOUR", contour_img)
cv2.imshow("CROP", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()


Предел изображения:

enter image description here

Морфология закрытое изображение:

enter image description here

Контурное изображение:

enter image description here

Результат:

enter image description here

1 голос
/ 04 мая 2020
import cv2 as cv
import numpy as np

frame = cv.imread('7dcoI.png')
frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
mask=cv.threshold(frame_gray, 85, 255, cv.THRESH_BINARY )[1] 
rows, cols = mask.shape
non_empty_columns = np.where(mask.min(axis=0)==0)[0]
non_empty_rows = np.where(mask.min(axis=1)==0)[0]
cropBox = (min(non_empty_rows), min(max(non_empty_rows), rows), min(non_empty_columns), min(max(non_empty_columns), cols))
cropped = frame[cropBox[0]:cropBox[1]+1, cropBox[2]:cropBox[3]+1 , :]
cv.imwrite('out_mask.png', cropped)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...