Python Поиск меток и переворачивание изображения CV2, NP, PIL
Задача перевернуть все изображения в папке так, чтобы они были горизонтальными. Я получаю фотографии бланков которые заполнены персональными данными, эти фотографии могут быть перевернуты, верх ногами, влево или вправо. До не давних пор я использовал метод поиска текста на изображении и определение угла, но данный способ не всегда корректно работает, когда фото размыто или неоднородный фон.
На самом фото (бланках) есть метки, которые когда-то хотели использовать для OCR, по левому краю всегда 3 черных квадрата. Я не силен в CV2 и хотел попросить помощи в нахождении этих квадратов на изображение и определении их положения, чтобы уже на основе этих данных крутить изображение. [![фото карточки][1]][1]
import os
import cv2
import numpy as np
from PIL import Image
import subprocess
import sys
import tkinter.filedialog as fd
from tkinter import messagebox as mb
from PIL import ImageFile
def good_message():
mb.showinfo(
title="PIC_VORTEX",
message='Фух, все перевернул...')
def bad_message():
mb.showwarning(
title="PIC_VORTEX",
message='Опачки, что-то не так...')
def detect_angle(image):
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3, 3), 0)
adaptive = cv2.adaptiveThreshold(blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 15, 4)
cnts = cv2.findContours(adaptive, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < 45000 and area > 20:
cv2.drawContours(mask, [c], -1, (255, 255, 255), -1)
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
h, w = mask.shape
# Horizontal
if w > h:
left = mask[0:h, 0:0 + w // 2]
right = mask[0:h, w // 2:]
left_pixels = cv2.countNonZero(left)
right_pixels = cv2.countNonZero(right)
return 0 if left_pixels >= right_pixels else 180
# Vertical
else:
top = mask[0:h // 2, 0:w]
bottom = mask[h // 2:, 0:w]
top_pixels = cv2.countNonZero(top)
bottom_pixels = cv2.countNonZero(bottom)
return 90 if bottom_pixels >= top_pixels else 270
def vortex():
# try:
path_pic = sys.argv[1]
for row in os.listdir(path_pic):
path = path_pic + '\\' + row
filename, file_extension = os.path.splitext(path)
if str(file_extension) in ('.JPG','.PNG','.JPEG','.TIFF','.JPEG 2000','.jpg','.png','.jpeg','.tiff','.jpeg 2000'):
stream = open(path, "rb")
bytes = bytearray(stream.read())
numpyarray = np.asarray(bytes, dtype=np.uint8)
image = cv2.imdecode(numpyarray, cv2.IMREAD_UNCHANGED)
# image = cv2.imread(path)
angle = detect_angle(image)
angle = -angle
print(angle)
ImageFile.LOAD_TRUNCATED_IMAGES = True
im = Image.open(path)
im_rotate = im.rotate(angle, expand=True)
im_rotate.save(path, quality=95)
im.close()
print(row)
good_message()
# except:
# bad_message()
if __name__ == '__main__':
vortex()
print('Готово')```
[1]: https://i.stack.imgur.com/MM9wE.jpg
[2]: https://i.stack.imgur.com/BKWEU.jpg