Django-OpenCV : Недопустимое количество каналов во входном изображении:

Я хочу загружать изображения в мой бэкенд django и обрабатывать их и подготавливать для OCR перед сохранением. Однако для некоторых изображений я получаю эту ошибку :

Недопустимое количество каналов во входном изображении: 'VScn::contains(scn)' где 'scn' равно 1

я попытался запустить конвейер обработки на jupyter и использовал то же изображение, и ошибка не появилась, так что, возможно, при сохранении изображения в ImageField возникает эта ошибка, однако я не могу ее исправить.

вот код обработки (preprocessing.py)

from cv2 import cv2
import numpy as np
from matplotlib import pyplot as plt


def process_image(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    blur = cv2.GaussianBlur(gray, (9, 9), 0)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 5))
    dilate = cv2.dilate(thresh, kernel, iterations=5)

    # Find all contours
    contours, hierarchy = cv2.findContours(dilate, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
    contours = sorted(contours, key = cv2.contourArea, reverse = True)

    # Find largest contour and surround in min area box
    largestContour = contours[0]
    minAreaRect = cv2.minAreaRect(largestContour)

    # Determine the angle. Convert it to the value that was originally used to obtain skewed image
    angle = minAreaRect[-1]
    if angle < -45:
        angle = 90 +angle
    elif (angle>-45)and(angle<=0):
        angle=angle
    elif ((angle==90) or (angle<8)):
        angle=0
    elif (angle>40) and (angle<90) :
        angle=-(90-angle)
    else :
        angle=angle
    print(angle)

    contours, heiarchy = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cntsSorted = sorted(contours, key=lambda x:cv2.contourArea(x))
    cnt = cntsSorted[-1]
    x, y, w, h = cv2.boundingRect(cnt)
    crop = gray[y:y+h, x:x+w]

    (h, w) = crop.shape[:2]
    center = (w // 2, h // 2)
    M = cv2.getRotationMatrix2D(center,angle, 1.0)
    rotated = cv2.warpAffine(crop, M, (w, h),flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
    #Noise removal
    kernel = np.ones((1, 1), np.uint8)
    noiseless = cv2.dilate(rotated, kernel, iterations=1)
    kernel = np.ones((1, 1), np.uint8)
    noiseless = cv2.erode(noiseless, kernel, iterations=1)
    noiseless = cv2.morphologyEx(noiseless, cv2.MORPH_CLOSE, kernel)
    #Thresholding
    return noiseless

и вот модель, в которой я передаю изображение в препроцессинг перед сохранением (models.py)

class Uploads(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title=models.CharField(max_length=100,default='none')
    image=models.ImageField(upload_to='media',unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    associatedFile=models.ForeignKey(to=File, on_delete=models.CASCADE,null=True)
    owner=models.ForeignKey(User,related_name="uploads", on_delete=CASCADE,null=True)


    def save(self, *args, **kwargs):
        pil_img=PIL.Image.open(self.image)

        cv_img=np.array(pil_img)
        img =process_image(cv_img)

        #convertback
        im_pill=PIL.Image.fromarray(img)

        #save
        buffer=BytesIO()
        im_pill.save(buffer,format='png') #format png jpeg ...pil_img.format
        image_final=(buffer.getvalue())

        self.image.save(str(self.image),ContentFile(image_final),save=False)
        super(Uploads, self).save(*args, **kwargs)

Спасибо всем, кто готов помочь!

Вернуться на верх