Python 使用opencv消除眩光并保持边缘远离眩光

Python 使用opencv消除眩光并保持边缘远离眩光,python,opencv,Python,Opencv,我有这样的图像: 我正试图得到图像的轮廓,但正如我们在这里看到的: 在有眩光的地方,一些圆的轮廓不会被画出来 我假设如果我在这张照片上消除了眩光,当我使用canny时,边缘将正确绘制 我是openCV新手,我在这里读过一些帖子,并尝试了一些技术,但根本没有成功 注意:我是用python做这件事的 有人能帮忙吗?非常感谢 我首先尝试的内容: import cv2 as cv img = cv.imread('Photos/board.jpg') canny = cv.Canny(img, 12

我有这样的图像:

我正试图得到图像的轮廓,但正如我们在这里看到的: 在有眩光的地方,一些圆的轮廓不会被画出来

我假设如果我在这张照片上消除了眩光,当我使用canny时,边缘将正确绘制

我是openCV新手,我在这里读过一些帖子,并尝试了一些技术,但根本没有成功

注意:我是用python做这件事的 有人能帮忙吗?非常感谢

我首先尝试的内容:

import cv2 as cv

img = cv.imread('Photos/board.jpg')

canny = cv.Canny(img, 125, 175)

contours, hierarchies = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)

blank = np.zeros(img.shape, dtype='uint8')
cv.drawContours(blank, contours, -1, (0,0,255),1)
cv.imshow('Contours drawn', blank)
结果

第二次尝试会更好一些,但结果中会出现无用的东西

adaptive_thresh = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 13, 2)
cv.imshow('Adaptive thresholding', adaptive_thresh)

canny = cv.Canny(adaptive_thresh, 125, 175)
cv.imshow('Canny edges', canny)

结果(照片上出现的白色像素太多:

我认为最简单的方法是更改Canny检测的第二个值,如下所示:

canny=cv.canny(img,25175)

下限阈值(第二个参数)设置得越低,则可以避免这种眩光效果。详细信息

从我的观点来看,你也可以在hsv空间中工作,如果你想从这样效果的图像中提取信息,那么hsv空间会更加舒适。更多关于的信息。图3 a)说明了这一点

这是完整的代码,您的代码中有一些错误(可能您使用的是旧的opencv版本)


编辑:我还想告诉你,这里很难使用提取的坐标。您最好使用和来提取和使用棋盘和冰球的坐标。

请发布您的代码或部分代码。在使用cv2.findContours之前,您的cv2.threshold参数是什么?@Panda50添加了更多信息,谢谢:)谢谢您的回答,使用这些设置肯定会更好,而且还需要识别冰球颜色。您推荐某种工具吗?非常感谢。要获得颜色,您需要进入hsv(当然)。然后,如果一组颜色总是相同的,你可以在上面加上遮罩,看看你的冰球在哪里。下面是一个很好的教程,教您如何处理颜色:
import numpy as np
img = cv.imread(r'C:\Users\MyUser\Desktop\board.jpeg')
canny = cv.Canny(img, 25, 175)

img2, contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)

blank = np.zeros(img.shape, dtype='uint8')
cv.drawContours(blank, contours, -1, (0,0,255),1)
cv.imshow('Contours drawn', blank)
cv.waitKey(0)