【发布时间】:2020-06-15 16:51:22
【问题描述】:
这是我的测试照片
我正在寻找卡片的边缘。但是,如您所见,边缘有些模糊。
为了找到边缘,我首先增强了图像的对比度,希望模糊的边缘不会那么模糊,并且更容易找到: 然后我用高斯模糊稍微平滑了一点(我尝试去除高斯模糊,但边缘检测器在背景中发现了很多细节+在卡片中)。
然后我使用带有“动态阈值”的 canny 并得到以下结果: 正如你所看到的,我发现了卡片的任何边缘(除了左边,因为背景很暗,这很容易)。是否有稳健的(我不想在此图像上“过度拟合”)方法来找到直线模糊边缘?
在这里找到了一些建议: Blurry edge detection How to find accurate corner positions of a distorted rectangle from blurry image in python?,但没有一个结果令人满意。
完整代码:
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()
【问题讨论】:
-
ID的底部将很难一步找到。您可以将阈值放宽到 canny 并对返回的边缘进行后处理,或者编写自己的边缘检测方式。在某种程度上,顶部和左侧边缘的检测应该更容易。您真正需要的是左上角和左下角来查找倾斜和比例。
-
测试图像中的信息是否用红色进行了编辑?还是在发布图片之前手动添加?
-
@eldesgraciado 我在发布图片之前手动添加了红色(尽管我在这张图片上运行了算法)。
标签: python opencv computer-vision