OpenCV——边缘检测

OpenCV提供了很多边缘检测滤波函数,包括Laplacian()、Sobel()以及Scharr()。这些滤波函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和颜色。

例如:

import cv2

if __name__ == "__main__":
    img = cv2.imread("lena.jpg")
    cv2.Laplacian(img, cv2.CV_8U, img, ksize=5)
    cv2.imshow("img", img)
    cv2.waitKey()
    cv2.destroyAllWindows()

  • lena.jpg

OpenCV——边缘检测

  • img

OpenCV——边缘检测

但是这些函数都很容易将噪声错误地识别为边缘。缓解这个问题的方法是在找到边缘之前对图像进行模糊处理。OpenCV也提供了许多模糊滤波函数,包括blur()、medianBlur()以及GaussianBlur()。

  • 源代码
def stroke_edges(src, dst, blur_ksize=7, edge_ksize=5):
    if blur_ksize >= 3:
        blurred_src = cv2.medianBlur(src, blur_ksize)
        gray_src = cv2.cvtColor(blurred_src, cv2.COLOR_BGR2GRAY)
    else:
        gray_src = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    cv2.Laplacian(gray_src, cv2.CV_8U, gray_src, ksize=edge_ksize)
    normalized_inverse_alpha = (1.0 / 255) * (255 - gray_src)
    channels = cv2.split(src)
    for channel in channels:
        channel[:] = channel * normalized_inverse_alpha
    cv2.merge(channels, dst)
    
  • 模糊滤波后

OpenCV——边缘检测

  • 转化为黑白后

OpenCV——边缘检测

  • 边缘提取后

OpenCV——边缘检测

  • 归一化并与源图像相乘

OpenCV——边缘检测


想了解更多关于数字图像处理:数字图像处理专栏