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

Ответы (0 шт):