OpenCV+Python 角点检测

作者: 音符纸飞机 | 来源:发表于2018-10-12 20:46 被阅读74次

    定义

    狭义:两条边的交点
    广义:图像中具有某些数学特征的坐标。如局部最大或最小的灰度

    如上图有三个颜色的框框,如果我们对蓝色框框进行移动,无论是水平还是垂直的方向移动都不会对框框内像素造成很大的变化,这种是内部区域。
    如果我们对黑色的框框进行移动,那么水平方向上移动像素值是不会有什么太大的变化的,如果是垂直方向上移动那么就会变化很大,这种一般称为边缘区域。
    对红色的框框进行移动,无论是往哪个方向进行偏移都会对框框内的像素值造成很大的变动,那么红色框住的区域的边角点,我们就称为角点。

    Harris角点检测

    原理

    稳定性高,尤其对L型角点(也就是直角)检测精度高。缺点也是明显的,就是运算速度慢,对图片大小敏感。

    cv2.cornerHarris(src, block_size, ksize, k)
    '''
    src 必须是float32
    block_size 邻域大小,越大表示用更粗的点标记角点
    ksize Sobel求导中的窗口大小
    k 自由参数,取值[0.04, 0.06]
    ''' 
    
    实战
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('forGrab.jpg')
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    gray = np.float32(gray)
    dst_block9_ksize19 = cv2.cornerHarris(gray, 9, 19, 0.04)
    img1 = np.copy(img)
    img1[dst_block9_ksize19 > 0.01 * dst_block9_ksize19.max()] = [0, 0, 255]
    
    dst_block5_ksize19 = cv2.cornerHarris(gray, 5, 19, 0.04)
    img2 = np.copy(img)
    img2[dst_block5_ksize19 > 0.01 * dst_block5_ksize19.max()] = [0, 0, 255]
    
    dst_block9_ksize5 = cv2.cornerHarris(gray, 9, 5, 0.04)
    img3 = np.copy(img)
    img3[dst_block9_ksize5 > 0.01 * dst_block9_ksize5.max()] = [0, 0, 255]
    
    dst_block9_ksize31 = cv2.cornerHarris(gray, 9, 31, 0.04)
    img4 = np.copy(img)
    img4[dst_block9_ksize31 > 0.01 * dst_block9_ksize31.max()] = [0, 0, 255]
    
    dst_block9_ksize19_k6 = cv2.cornerHarris(gray, 9, 19, 0.06)
    img5 = np.copy(img)
    img5[dst_block9_ksize19_k6 > 0.01 * dst_block9_ksize19_k6.max()] = [0, 0, 255]
    
    dst_block9_ksize19_k6_1e_5 = cv2.cornerHarris(gray, 9, 19, 0.06)
    img6 = np.copy(img)
    img6[dst_block9_ksize19_k6_1e_5 > 0.00001 * dst_block9_ksize19_k6_1e_5.max()] = [0, 0, 255]
    
    titles = ["Original", "block9_ksize19", "dst_block5_ksize19", "dst_block9_ksize5", "dst_block9_ksize31",
              "dst_block9_ksize19_k6", "dst_block9_ksize19_k6_1e_5"]
    imgs = [img, img1, img2, img3, img4, img5, img6]
    for i in range(len(titles)):
        plt.subplot(3, 3, i + 1), plt.imshow(imgs[i]), plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()
    
    Harris角点检测

    相关文章

      网友评论

        本文标题:OpenCV+Python 角点检测

        本文链接:https://www.haomeiwen.com/subject/qerviftx.html