#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?