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()

机器学习进阶-图像特征harris-角点检测 1.cv2.cornerHarris(进行角点检测)的更多相关文章

  1. 机器学习进阶-图像特征sift-SIFT特征点 1.cv2.xfeatures2d.SIFT_create(实例化sift) 2. sift.detect(找出关键点) 3.cv2.drawKeypoints(画出关键点) 4.sift.compute(根据关键点计算sift向量)

    1. sift = cv2.xfeatures2d.SIFT_create() 实例化 参数说明:sift为实例化的sift函数 2. kp = sift.detect(gray, None)  找出 ...

  2. 机器学习进阶-图像基本操作-边界补全操作 1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 进行边界的补零操作 2.cv2.BORDER_REPLICATE(边界补零复制操作)...

    1.cv2.copyMakeBoder(img, top_size, bottom_size, left_size, right_size, cv2.BORDER_REPLICATE) 参数说明: i ...

  3. 机器学习进阶-案例实战-答题卡识别判 1.cv2.getPerspectiveTransform(获得投射变化后的H矩阵) 2.cv2.warpPerspective(H获得变化后的图像) 3.cv2.approxPolyDP(近似轮廓) 4.cv2.threshold(二值变化) 7.cv2.countNonezeros(非零像素点个数)6.cv2.bitwise_and(与判断)

    1.H = cv2.getPerspectiveTransform(rect, transform_axes) 获得投射变化后的H矩阵 参数说明:rect表示原始的位置左上,右上,右下,左下, tra ...

  4. 机器学习进阶-图像基本操作-数值计算 1.cv2.add(将图片进行加和) 2.cv2.resize(图片的维度变换) 3.cv2.addWeighted(将图片按照公式进行重叠操作)

    1.cv2.add(dog_img, cat_img)  # 进行图片的加和 参数说明: cv2.add将两个图片进行加和,大于255的使用255计数 2.cv2.resize(img, (500, ...

  5. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

  6. 机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

    1. cv2.matchTemplate(src, template, method)  # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...

  7. 机器学习进阶-图像金字塔与轮廓检测-图像金字塔-(**高斯金字塔) 1.cv2.pyrDown(对图片做向下采样) 2.cv2.pyrUp(对图片做向上采样)

    1.cv2.pyrDown(src)  对图片做向下采样操作,通常也可以做模糊化处理 参数说明:src表示输入的图片 2.cv2.pyrUp(src) 对图片做向上采样操作 参数说明:src表示输入的 ...

  8. 机器学习进阶-目标跟踪-KCF目标跟踪方法 1.cv2.multiTracker_create(构造选框集合) 2. cv2.TrackerKCF_create(获得KCF追踪器) 3. cv2.resize(变化图像大小) 4.cv2.selectROI(在图像上框出选框)

    1. tracker = cv2.multiTracker_create() 获得追踪的初始化结果 2.cv2.TrackerKCF_create() 获得KCF追踪器 3.cv2.resize(fr ...

  9. 机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)

    1. cv2.equalizeHist(img)  # 表示进行直方图均衡化 参数说明:img表示输入的图片 2.cv2.createCLAHA(clipLimit=8.0, titleGridSiz ...

随机推荐

  1. eKingCloud 从 OpenStack 到 OpenInfra 演进之路

    本内容首发于 2016/06/21 北京 OpenInfra 大会上本人的演讲 发文章要求至少150个字,那就把最后一页说明一下吧. 我前面介绍了我们的5大产品,包括企业的私有云架构和实践,包括企业数 ...

  2. [UE4]单机游戏改网络游戏,不完全清单

    把Actor的复制打开 中腰数据的复制打开,且只在服务器修改(比如角色属性血量) 需要同步的Actor,不在客户端Spawn 客户端的操作,先报告到服务器,服务器再广播到所有客户端 某些逻辑只在服务器 ...

  3. [UE4]封装蓝图函数Print String

    World Context Object一定要赋值才会在多人游戏中出现Server和Client,如下图所示:

  4. centos 7 修改host文件

    centos7与之前的版本都不一样,修改主机名在/ect/hostname 和/ect/hosts 这两个文件控制 首先修改/etc/hostname vi /etc/hostname 打开之后的内容 ...

  5. http、TCP/IP协议与socket之间的区别(转载)

    http.TCP/IP协议与socket之间的区别  https://www.cnblogs.com/iOS-mt/p/4264675.html http.TCP/IP协议与socket之间的区别   ...

  6. MFC+mongodb+nodejs 数据库的读取与写入操作

    首先通过nodejs和mongodb建立后端服务器 一.在windows平台下启动mongodb服务器 1.进入mongodb的安装目录,并进去bin目录启动mongod 2.在d盘建立mongodb ...

  7. 第5章 IP地址和子网划分(1)_IP格式和子网掩码

    1. 二进制和十进制 (1)二进制与十进制的对应关系 ①128为数轴的中点,最高位为1.其后的数,二进制最高位均为1.其前面的数二进制最高位均为0. ②192为128-255中间的数,最高两位为1.2 ...

  8. JS一个算法题

    题目:实现超出整数存储范围的两个大整数想加function(a,b).注意:参数a和b以及函数返回值都是字符串. 目的:考算法, 基本逻辑. 我实现的基本思路是: ①两个数字字符串长度补成一样,用字符 ...

  9. Linux下用node-inspector实现NodeJS远程调试开发

    1.首先安装 node-inspector npm install -g node-inspector -g表示全局安装,如果像我一样安装失败,再试几次,npm偶尔就会这样抽风... 这一步是关键的, ...

  10. 普通数组和json数组的区别

    PHP 数组 什么是数组? 数组是特殊的变量,它可以同时保存一个以上的值. 在 PHP 中创建数组 在 PHP 中, array() 函数用于创建数组 在 PHP 中,有三种数组类型: 索引数组 - ...