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)
Спасибо всем, кто готов помочь!