Обрезать поля из изображения с помощью OpenCV — Contours (Python)

#python #python-3.x #opencv #opencv-contour

#python #python-3.x #opencv #контур

Вопрос:

Я обрезаю поля с изображения с помощью функции OpenCV contours, каждое поле содержит рукописный номер, если это число выходит из поля, которое невозможно обрезать с помощью OpenCV-contours, как показано на изображении.

введите описание изображения здесь

Вот рабочий код, который я пробовал…

     self.image = cv2.imread("1.jpg")
    self.res = cv2.imread("1.jpg")
    self.store_path = "cropped/" 

    #define kernal value
    kernel = np.ones((2,2),np.uint8)

    #grayscale
    gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY)

    ret, threshold = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
    threshold = cv2.bitwise_not(threshold)       
    dilate = cv2.dilate(threshold,kernel,iterations = 1)

    ret, threshold = cv2.threshold(dilate,127,255,cv2.THRESH_BINARY)
    dilate = cv2.dilate(threshold,kernel,iterations = 1)

    contours, hierarchy = cv2.findContours(dilate,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    test_contours = []
    test_count = 0

    for i in range(1,len(contours)):
        approx = cv2.approxPolyDP(contours[i],cv2.arcLength(contours[i],True)*0.02,True)
        if(abs(cv2.contourArea(contours[i]))<100 or not(cv2.isContourConvex(approx))):
            continue

        if(len(approx) > 0):
            vtc = len(approx)
            cos = []
            for j in range(2,vtc 1):
                cos.append(self.angle(approx[j%vtc],approx[j-2],approx[j-1]))
            cos.sort()
            self.mincos = cos[0]
            self.maxcos = cos[-1]


            x,y,w,h = cv2.boundingRect(contours[i])
            roi = self.image[y:y h, x:x w]

            #remove small 
            row, col, channels = roi.shape
            diff = abs(row - col)
            size = roi.size
            if diff < 4 or diff > 50 or size < 5000 or size > 25000:
                continue
            test_count = test_count   1
            cv2.imwrite(self.store_path   "Answers/"   str(i) "_" str(diff) "_" str(roi.size) ".jpg", roi) 
            rect = cv2.minAreaRect(contours[i])
            box = cv2.boxPoints(rect)
            box = np.int0(box)
            cv2.drawContours(self.res,[box],0,(0,255,0),2)
            test_contours.append(contours[i])

    print(upload_sheet "_" str(self.page_type) "_" str(test_count))
    # remove the contours from the image and show the resulting images
    cv2.imwrite(self.store_path   'res.jpg', self.res)    

#END
 

Комментарии:

1. как показано на каком изображении? У вас есть пример кода?

2. Привет @ReneB. рабочий код обновлен, пожалуйста, проверьте его.

3. попробуйте уменьшить / увеличить значение расширения. Попробуйте использовать эрозию вместо расширения

4. Привет @FindOutIslamNow, я пытался расширять и размывать множеством разных способов, но этого не происходит…

5. Вы пытались протестировать другие параметры для cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE?