Многое зависит от того, какие типы изображений у вас есть, но если это четкие изображения сверху вниз, вы можете использовать золотую полосу / центр, чтобы различать их.
Сначала создается маска на основезолотистый цвет. (Вам, вероятно, придется сделать цветовую гамму более специфичной - у меня было простое изображение. Я использовал этот удобный скрипт для определения цветовой гаммы.) Затем некоторый шум удаляется, а затем обнаруживаются контуры. Контуры, не имеющие дочернего или родительского контура, являются твердым центром монеты стоимостью 2 евро. Контуры с ребенком, но без родителя - это полоса монеты в 1 евро. Контуры с родителем, но без ребенка, являются центром монеты в 1 евро и игнорируются.
€ 2 рисуется красным, 1 евро синим.
![enter image description here](https://i.stack.imgur.com/9CFUz.png)
import cv2
import numpy as np
# load image
img = cv2.imread("E1E2.jpg")
# Convert to HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# define range wanted color in HSV
lower_val = np.array([0,25,0])
upper_val = np.array([179,255,255])
# Threshold the HSV image to get only goldish colors
mask = cv2.inRange(hsv, lower_val, upper_val)
# remove noise
kernel = np.ones((5,5))
mask_open = cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)
mask_close = cv2.morphologyEx(mask_open,cv2.MORPH_CLOSE,kernel)
# find contours
contours, hier = cv2.findContours(mask_close,cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# loop through contours, check hierarchy, draw contours
for i, cnt in enumerate(contours):
(prev, nxt, child, parent) = hier[0][i]
if child == -1 and parent == -1 :
# €2
cv2.drawContours(img, [cnt],0,(0,0,255), 3)
if child != -1 and parent == -1 :
# €1
cv2.drawContours(img, [cnt],0,(255,0,0), 3)
# display image
cv2.imshow("Res", img)
cv2.waitKey(0)
cv2.destroyAllWindows()