【发布时间】:2019-06-18 04:24:24
【问题描述】:
我试图几乎完全通过使用 OpenCV 的图像预处理技术(在 Python 中)来检测黑白足球。我的想法如下;
- 处理图像(例如模糊二值照片)
- 为足球找到多个“候选者”(例如通过轮廓检测)
- 调整这些候选对象的大小(例如调整为 48x48 像素)并在一个非常简单的神经网络中输入其像素对应的布尔值(0 = 黑色像素,1 = 白色像素),然后为每个候选对象输出一个置信度值
- 确定照片中是否有足球以及最可能的位置
我一直在寻找合适的候选人。目前,这是我的方法;
Step 2: The blurred image (medianblur, kernel 7)
第三步:Generated binary image AGenerated binary image B
然后我使用 findContours 在二值图像上查找轮廓。如果在二值图像 B 上没有找到候选对象(使用最小和最大边界框阈值),findContours 将在二值图像 A 上运行(并返回候选对象)。如果在二值图像 B 上找到一个或多个候选者,则原始图像将被重新模糊(使用内核 15),二值图像 C 将用于寻找轮廓并返回候选者。见:Generated binary image C
这是生成这些二进制图像的代码:
def generateMask(imgOriginal, rgb, margin):
lowerLimit = np.asarray(rgb)
upperLimit = lowerLimit+margin
# switch limits if margin is negative
if(margin < 0):
lowerLimit, upperLimit = upperLimit, lowerLimit
mask = cv.inRange(imgOriginal, lowerLimit, upperLimit)
return mask
# generates a set of six images with (combinations of) mask(s) applied
def applyMasks(imgOriginal, mask1, mask2):
# applying both masks to original image
singleAppliedMask1 = cv.bitwise_and(imgOriginal, imgOriginal, mask = mask1) #res3
singleAppliedMask2 = cv.bitwise_and(imgOriginal, imgOriginal, mask = mask2) #res1
# applying masks to overlap areas in single masked and original image
doubleAppliedMaskOv1 = cv.bitwise_and(
imgOriginal,
singleAppliedMask1,
mask = mask2
) #res4
doubleAppliedMaskOv2 = cv.bitwise_and(
imgOriginal,
singleAppliedMask2,
mask = mask1
) #res2
# applying masks to joint areas in single masked and original image
doubleAppliedMaskJoin1 = cv.bitwise_or(
imgOriginal,
singleAppliedMask1,
mask = mask2
) #res7
doubleAppliedMaskJoin2 = cv.bitwise_or(
imgOriginal,
singleAppliedMask2,
mask = mask1
) #res6
return (
singleAppliedMask1, singleAppliedMask2,
doubleAppliedMaskOv1, doubleAppliedMaskOv2,
doubleAppliedMaskJoin1, doubleAppliedMaskJoin2
)
def generateBinaries(appliedMasks):
# variable names correspond to output variables in applyMasks()
(sam1, sam2, damov1, damov2, damjo1, damjo2) = appliedMasks
# generate thresholded images
(_, sam1t) = cv.threshold(sam1, 0, 255, cv.THRESH_BINARY_INV)
(_, sam1ti) = cv.threshold(sam1, 0, 255, cv.THRESH_BINARY_INV)
(_, sam2t) = cv.threshold(sam2, 0, 255, cv.THRESH_BINARY)
(_, sam2ti) = cv.threshold(sam2, 0, 255, cv.THRESH_BINARY_INV)
(_, damov1t) = cv.threshold(damov1, 0, 255, cv.THRESH_BINARY)
(_, damov2t) = cv.threshold(damov2, 0, 255, cv.THRESH_BINARY_INV)
(_, damjo1t) = cv.threshold(damjo1, 0, 255, cv.THRESH_BINARY_INV)
(_, damjo2t) = cv.threshold(damjo2, 0, 255, cv.THRESH_BINARY)
# return differences in binary images
return ((damov2t-sam2t), (sam1t-damov1t), (sam2ti-damjo2t))
此示例图像中的结果很好且非常有用,尽管它看起来非常错误:see result。
很容易让这个示例图像的结果更好(例如,只返回一个或两个候选对象,其中包括一个完美的足球边界框),但是,在对参数进行大量参数调整后,我此示例中使用的似乎产生了最佳的整体召回率。
但是,我非常关注某些照片,我将展示原始图像、二进制 A 和 B 图像(基于使用内核 7 模糊的原始图像中值生成)和二进制 C 图像(内核 15) .目前我的方法平均每张照片返回大约 15 个候选者,其中 25% 的照片至少包含一个完美的球边界框,而对于大约 75% 的照片,至少 strong> 包含一个部分正确的边界框(例如,在边界框中有一块球,或者只是球本身的一块)。
Original images + binary images A
Binary images B + binary images C
(我最多只能发布 8 个链接)
希望大家能给我一些建议。
【问题讨论】:
标签: python image opencv machine-learning detection