zoukankan      html  css  js  c++  java
  • 机器学习进阶-图像特征harris-角点检测 1.cv2.cornerHarris(进行角点检测)

    1.cv2.cornerHarris(gray, 2, 3, 0.04)  # 找出图像中的角点

    参数说明:gray表示输入的灰度图,2表示进行角点移动的卷积框,3表示后续进行梯度计算的sobel算子的大小,0.04表示角点响应R值的α值

    角点检测:主要是检测一些边角突出来的点,对于A和B这样的面上的点而言,一个卷积框在上面移动,框中的基本像素点不发生变化, 对于像C和D边界点,只有x或者y轴方向上的平移,像素框内的像素会发生偏移,而对于E和F这样的角点而言,不管是像x轴或者向y轴平移,像素框内的像素都会发生偏移, 就好比图中的绿色方框一样

    角点检测的基本原理,使用一个3*3的卷积框,在图上每一点进行平移操作,对于当前位置,在向上或者向下,向左或者向右平移一个像素点后的,两个图像像素点之间的差异,即w表示的是加权值,可以全部都是1,也可以使用高斯卷积,以此对中心点的像素改变做加权

    使用一阶泰勒展开对I(x+∆x, y+∆y) 进行泰勒展开 等于 I(x, y) + Ix * ∆x + Iy*∆y + o(x, y)  Ix表示∂I(x, y) / ∂x 即该点对x方向上的梯度,同理Iy 

    对上述式子进行化解操作

    c(x, y, ∆x, ∆y) = (Ix * ∆x + Iy*∆y) ^ 2 

    将上述式子进行拆分 c(x, y, ∆x, ∆y) = (Ix * ∆x + Iy*∆y) ^ 2 = [∆x, ∆y] * M * [∆x, ∆y]

    那么上述的式子就化解乘了A∆x ^ 2 + 2C*∆x * ∆y +∆y ^ 2 这是一个斜椭圆方程,对M(x, y)进行特征变换, 获得特征值λ1和λ2,即最终的表示为λ1*∆x ^ 2 + λ2*∆y ^ 2

    即对斜椭圆做了一个变化,使得其是一个正椭圆,结果不变

    举例说明,λ1越大,那么x轴的方向上∆x变化,所引起的变化也就越大,即像素的变化越大

     

    根据λ1和λ2的对比,我们可以知道x方向和y轴方向的y轴的像素变化情况,因此可以判断到底是什么边界

    右边的是角点响应值,用来进行实际的计算

    在一个角点附近可能存在多个角点,因此我们需要对角点做一个极大值抑制操作

     代码:

    第一步:读入图片

    第二步:对图片进行灰度值变化

    第三步:使用cv2.cornerHarris进行角点检测

    第四步:判断dst > dst.max() * 0.01 的角点在图上进行标红

    # cv2.cornerHarris()
    import cv2
    
    # 进行角点检测
    # 第一步:读取图片
    img = cv2.imread('test_1.jpg')
    # 第二步:进行灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 第三步:进行角点检测
    dst = cv2.cornerHarris(gray, 2, 3, 0.04)
    # 第四步:进行画图秒点操作
    img[dst > 0.01*dst.max()] = (0, 0, 255)
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

  • 相关阅读:
    大公司?小公司?
    git 学习笔记
    django学习笔记
    web servieces 学习小栗子
    python列表推导式
    什么叫事务,事务的特性
    监听问题汇总
    oracle数据库导入导出
    ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务--解决办法(转)
    目标修正
  • 原文地址:https://www.cnblogs.com/my-love-is-python/p/10411263.html
Copyright © 2011-2022 走看看