【发布时间】:2022-01-03 22:23:23
【问题描述】:
我正在尝试构建一个脚本,能够计算图片中有多少欧元(现在只是硬币)。为了做到这一点,我正在考虑首先定位硬币,然后比较它们的相对大小,以便了解每个硬币的价值,就像我在其他地方看到的那样。我的难点在于第一步,图像的预处理。 需要注意的是,只有当背景和某些硬币之间的对比度非常低时才会出现此问题
我已经尝试了各种方法预处理与不同的检测方法,如 connectedComponentsWithStats()、findContours() 和 SimpleBlobDetector,但我实现的最成功的组合是:
import numpy as np
import cv2
import os
path = 'GenericImages/TP2/'
path_coins_highlighted = 'GenericImages/Highlights'
path_gaussian_blurs = 'GenericImages/Gaussian_Blurs'
dirs = os.listdir(path)
i = 0
for file in dirs:
path2img = os.path.join(path, file)
img = cv2.imread(path2img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# clahe = cv2.createCLAHE(clipLimit=40, tileGridSize=(8, 8))
# equalized = clahe.apply(gray)
gray_blur = cv2.GaussianBlur(gray, (15, 15), 0)
# gray_blur = cv2.bilateralFilter(gray, 9, 65, 9)
circles = cv2.HoughCircles(gray_blur, cv2.HOUGH_GRADIENT, 1, 15, param1=50, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))
for x in circles[0, :]:
cv2.circle(img, (x[0], x[1]), x[2], (0, 255, 0), 2)
cv2.circle(img, (x[0], x[1]), 2, (0, 0, 255), 3)
cv2.imshow('Gray', gray)
cv2.imshow('Gaussian Blur', gray_blur)
path_save_gaussian_blur = os.path.join(path_gaussian_blurs, str(i) + '_gaussian_blur.jpg')
cv2.imwrite(path_save_gaussian_blur, gray_blur)
# cv2.imshow('equalized', equalized)
cv2.imshow('Highlights', img)
path_save_highlights = os.path.join(path_coins_highlighted, str(i) + '_highlight.jpg')
cv2.imwrite(path_save_highlights, img)
i += 1
cv2.waitKey(0)
问题在于检测的一致性,我相信当它失败时,它会这样做是因为背景和 HoughCircles 没有检测到的硬币之间几乎没有对比。下面的一组图像显示了算法失败的情况。
设置 0:
SET1:
我尝试使用均衡和具有不同参数的双边滤波器进行调整,以消除噪音但保留过渡区域(硬币的轮廓),但我没有发现显着的改进。
如果我应该寻找解决此问题的方向或想法,我将不胜感激。
【问题讨论】:
-
试试sobel/canny参数,是否提取右边缘。
标签: python opencv computer-vision contrast