Harris特征点检测器-兴趣点检测

1. 简介

    图形图像领域将特征点称为兴趣点或者角点,这些点通常具有选择不变性、光照不变性和视角不变性。Harris是角点检测的一种检测方法。

2. 角点

角点分析图

        如上图最左侧,蓝色的窗口在附近移动时,所包含的像素值并不会发生太大的变化,所以左图表示一个平坦区域。中间的这张图,沿水平方向移动,像素会发生很大变化(跳变),但在垂直方向移动,不会产生变化,所以它表示边缘特征。而又图,无论哪个方向移动,像素值都会发生很大变化,所以右图表示一个角点。


角点类型

3. 图像梯度

        “像素值发生很大变化”这一现象采用图像梯度来描述。在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。

        图像的梯度可以用微分或者导数的方式来表示。对于数字图像相当于使用二维离散函数求梯度,并使用差分近似求导:

Gx(x,y)=H(x+1,y)-H(x-1,y)

Gy(x,y)=H(x,y+1)-H(x,y-1)

        实际操作时,求梯度通常是求某个像素的某个邻域内的灰度变化。因此常对原始图像的某个邻域设置梯度算子,然后采用小区域模版进行卷积来计算。

4. Harris角点算法检测原理

        算法核心思想是利用局部窗口在图像上移动,判断灰度值是否发生较大变化,如果发生了较大变化,那么就存在角点。

        1. 窗口在x,y两个方向移动,并计算出窗口内像素的变化量E(x,y),

        2. 对于每一个窗口,计算其对应的角点响应函数R,

        3. 对该函数做阈值处理,如果 R>threshold,表示该窗口对应一个角点特征。

该算法的实现:

        1.建立数学模型:通过建立数学模型来确定哪些窗口会引起较大的灰度值变化。

                设窗口中心位于灰度图的(x,y)点,这个位置的灰度值为 I(x,y),这个窗口移动(u,v),此时(x+u,y+v)点的灰度值为I(x+u,y+v),| I(x+u,y+v) - I(x,y)|就是窗口移动引起的灰度的变化值。设W(x,y)为(x,y)处的窗口函数,表示窗口内各像素的权重。W(x,y)可设为1,也可设为正态分布函数。

                窗口函数的(u,v)移动产生的灰度值变化公式为:


图像窗口移动灰度值变化公式


泰勒公式转化E(u,v)


提出u,v得出近似形式


近似形式的矩阵M

                    对角化处理后,提出特征值\lambda 1 \lambda 2

            2. 角点响应函数R

        灰度值变化的大小取决于矩阵M,M为梯度的协方差矩阵。为了方便应用和编程,定义了角点响应函数R,通过R的大小来判断是否是角点。


角点响应函数R

        det(M)=\lambda 1\lambda 2是矩阵行列式,trace(M)=\lambda 1+\lambda 2是矩阵的迹。k是经验常数,一般0.04<k<0.06。R的值取决于M的特征值,角点的R很大,平坦区域R很小,边缘的R为负值。

            3. 角点判定

        角点:R很大,\lambda 1\lambda 2都很大。

        边缘:R为负值,\lambda 1>>\lambda 2 或 \lambda 2>>\lambda 1

        平坦:  R很小,\lambda 1\lambda 2都很小。

角点判定图

5. OpenCV的实现

    OpenCV中有提供角点检测函数cv2.cornerHarris( src, blockSize, ksize, k [, dst[, borderType]])。

        1. src输入灰度图,float32类型,

        2. blockSize 窗口的尺寸

        3. ksize用于计算梯度图的Sobel算子的尺寸

        4. k 响应函数的k值,0.04~0.06之间


代码:


import cv2 as cv        

from matplotlib import pyplot as plt

import numpy as np

# detector parameters

block_size = 3

sobel_size = 3 

k = 0.06

image = cv.imread('Scenery.jpg')

print(image.shape)

height = image.shape[0]

width = image.shape[1]

channels = image.shape[2]

print("width: %s height: %s channels: %s"%(width, height, channels))

gray_img = cv.cvtColor(image, cv2.COLOR_BGR2GRAY)

# modify the data type setting to 32-bit floating point

gray_img = np.float32(gray_img)

# detect the corners with appropriate values as input parameters

corners_img = cv.cornerHarris(gray_img, block_size, sobel_size, k)

# result is dilated for marking the corners, not necessary

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))

dst = cv.dilate(corners_img, kernel)

# Threshold for an optimal value, marking the corners in Green

#image[corners_img>0.01*corners_img.max()] = [0,0,255]

for r in range(height):

for c in range(width):

pix=dst[r,c]

if pix>0.05*dst.max():

cv2.circle(image,(c,r),5,(0,0,255),0)

image = cv.cvtColor(image, cv2.COLOR_BGR2RGB)

plt.imshow(image)

plt.show()



6. 测试结果


正常图检测


旋转图检测
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343