Вам нужно размыть, а затем применить порог, прежде чем найти контуры. Вы должны сделать это, потому что, если вы найдете контуры непосредственно на изображении в градациях серого, есть маленькие частицы, которые подобраны как контуры. Вот простой процесс:
- Загрузка изображения, оттенки серого, размытие по Гауссу, порог Оцу
- Поиск контуров и сортировка с использованием
imutils.contours.sort_contours()
с параметром left-to-right
- Получите ограничивающий прямоугольник, затем извлеките ROI, используя Numpy срез
Вот обнаруженные ограничивающие прямоугольники, выделенные зеленым
Извлеченные / сохраненные РИ
Код
import cv2
from imutils import contours
image = cv2.imread('1.png')
original = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
(cnts, _) = contours.sort_contours(cnts, method="left-to-right")
num = 0
for c in cnts:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 1)
ROI = original[y:y+h, x:x+w]
cv2.imwrite('ROI_{}.png'.format(num), ROI)
num += 1
cv2.imshow('image', image)
cv2.waitKey()