这是我的测试照片
我试图找到卡片的边缘。然而,正如您所见,边缘有些模糊。
为了找到边缘,我首先增强了图像的对比度,以便模糊的边缘会变得不那么模糊,更容易找到: 然后我使用高斯模糊对其进行了轻微平滑处理(我尝试过去除高斯模糊,但边缘检测器在背景和卡片中发现了太多细节)。
然后我使用带有“动态阈值”的Canny算法,并得到以下结果: 正如您所见,我几乎没有找到卡片的任何边缘(除了左边的一个,因为背景很暗)。是否有一种稳健的方法来找到直线模糊边缘?(我不想在这个图像上“过度拟合”)
在这里找到了一些建议: 模糊边缘检测 如何从模糊图像中准确地找到扭曲矩形的角位置?,但没有一个能够得到满意的结果。
完整代码:
def auto_canny(image, sigma=0.5):
v = np.median(image)
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
return cv2.Canny(image, lower, upper)
def add_contrast(img, contrast_level=8):
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(contrast_level, contrast_level))
cl = clahe.apply(l)
limg = cv2.merge((cl, a, b))
final = cv2.cvtColor(limg, cv2.COLOR_LAB2BGR)
return final
# ------------------------------------------ #
# FIND EDGES
# ------------------------------------------ #
img = add_contrast(img=img, contrast_level=8)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray", gray)
kernel_size = 5
blur_gray = cv2.GaussianBlur(gray, (kernel_size, kernel_size), 0)
edges = auto_canny(image=blur_gray)
# Show images for testing
cv2.imshow('edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()