使用nodeitk进行角点检測
前言
东莞,晴,33至27度。今天天气真好,学生陆续离开学校。忙完学生答辩事情,最终能够更新一下nodeitk。本文继续介绍node的特征识别相关内容,你会看到,採用nodeitk实现角点检測是一件十分简单的事情。
本文你将学到使用nodeitk进行角点检測:
1. 特征包括有哪些?为什么它们这么重要
2. 使用函数cornerHarris,利用Harris-Stephens方法检測角点
理论
什么是特征?
1. 在机器视觉中,通常我们在一个环境下的不同帧查找匹配点。为什么?这是由于假设我们知道两张图之间的相关性,我们就能够从两张图中提取它们包括的信息
2. 当我们说匹配点时,一般意义是指我们能够非常easy在场景中识别的特征。
3. 那么什么是特征呢?
a) 它必须是独有的能够识别的特性。
图像特征的类型
大概有:
1. 边缘
2. 角点(也称为感兴趣点)
3. 斑点(Blobs,也称为感兴趣区域)
在本文,我们将专门谈谈角点特征
为什么角点那么特别?
由于,它是两相交边的位置,代表两条边方向改变的位置。因此,角点往往是图像梯度(两个方向)急剧变化的位置。
算法描写叙述
当我们寻找角点,由于角点表示图像在梯度的变化,因此我们能够等价于寻找这“变化”
如果是一个灰度图像I。我们使用一个窗体做卷积(u为x方向位移,v为右方向位移):
当中
1. 是在位置的窗体
2. 是在位置的灰度
3. 是移动窗体处的灰度
由于我们希望找到灰度在窗体处存在较大的差异,以此找到角点的窗体位置。因此,我们最大化上述等式,令项:
使泰勒展式:
展开等式并化简:
使用矩阵形式表示:
令
那么等式能够表示为:
对于每一个窗体,採用以下评价函数以确定窗体是否包括角点
这里
1.
2.
当一个窗体的R值大于阈值时,被觉得是角点
源码:
var node_itk = require('./node-itk'); var thresh = 200; var max_thresh = 255; var source_window = "Source image"; var corners_window = "Corners detected"; var src = node_itk.cv.imread( "./images/lena.jpg", 1 ); var src_gray = node_itk.cv.CvtColor(src, node_itk.cv.CV_BGR2GRAY); node_itk.cv.NamedWindow( source_window, node_itk.cv.CV_WINDOW_AUTOSIZE ); node_itk.cv.NamedWindow( corners_window, node_itk.cv.CV_WINDOW_AUTOSIZE ); node_itk.cv.imshow( source_window, src ); var dst , dst_norm; node_itk.cv.CreateTrackbar( "Threshold: ", source_window, thresh, max_thresh, function (thresh){ dst = node_itk.cv.NodeOpenCVMat.Zeros(src.Size(), node_itk.cv.CV_32FC1) dst_norm = dst.Clone(); blockSize = 2; apertureSize = 3; k = 0.04; node_itk.cv.CornerHarris( src_gray, dst, blockSize, apertureSize, k ); node_itk.cv.Normalize(dst,dst_norm, 0, 255,node_itk.cv.NORM_MINMAX,node_itk.cv.CV_32FC1) dst_norm_scaled = node_itk.cv.ConvertScaleAbs(dst_norm); for (var j = 0; j<dst_norm.Rows(); j++) { for (var i = 0; i <dst_norm.Cols(); i++) { if (dst_norm.At([j,i])>thresh) { node_itk.cv.Circle(dst_norm_scaled, new node_itk.cv.NodeOpenCVPoint("Point", [i,j]), 5, new node_itk.cv.NodeOpenCVScalar("Scalar", 0), 2, 8, 0); } }; }; node_itk.cv.NamedWindow(corners_window,node_itk.cv.CV_WINDOW_AUTOSIZE ); node_itk.cv.imshow( corners_window,dst_norm_scaled ); } ); node_itk.cv.WaitKey ( 0 );
执行结果
小结
nodeitk实现角点检測是一件十分easy的事情,在后面我们将深入介绍相关特征识别的内容,当前特征识别模块已经开发完成。待续。