Вот подход
- Преобразование изображения в оттенки серого и медианное размытие в сглаженное изображение
- Резкость изображения для улучшения краев
- Порог
- Выполнитьморфологические преобразования
- Поиск контуров и фильтра с использованием минимальной / максимальной пороговой области
- Обрезка и сохранение ROI
Резкость изображения с помощью cv2.filter2D()
.Мы используем универсальное ядро повышения резкости, другие ядра можно найти здесь
Теперь порог для получения двоичного изображения
Выполнение морфологических операций
Отсюда мы находим контуры и фильтруем, используяcv2.contourArea()
с минимальными / максимальными пороговыми областями.
Мы можем обрезать каждую нужную квадратную область, используя Numpy, и сохранять каждый ROI следующим образом:
x,y,w,h = cv2.boundingRect(c)
ROI = image[y:y+h, x:x+h]
cv2.imwrite('ROI_{}.png'.format(image_number), ROI)
import cv2
import numpy as np
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, 5)
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen = cv2.filter2D(blur, -1, sharpen_kernel)
thresh = cv2.threshold(sharpen,160,255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
min_area = 100
max_area = 1500
image_number = 0
for c in cnts:
area = cv2.contourArea(c)
if area > min_area and area < max_area:
x,y,w,h = cv2.boundingRect(c)
ROI = image[y:y+h, x:x+h]
cv2.imwrite('ROI_{}.png'.format(image_number), ROI)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
image_number += 1
cv2.imshow('sharpen', sharpen)
cv2.imshow('close', close)
cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()