图像的特征值
图像的特征值简单理解就是边缘,角点,纹理等
角点
在图像的边缘中,有一些特殊的像素点值得我们特别关注,那就是图像边缘的角点,角点更好反应图像中对象的整体特征
private void harrisCornerDemo(Mat src, Mat dst) {
// 定义阈值T
int threshold = 100;
Mat gray = new Mat();
Mat response = new Mat();
Mat response_norm = new Mat();
// 角点检测
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.cornerHarris(gray, response, 2, 3, 0.04);
Core.normalize(response, response_norm, 0, 255, Core.NORM_MINMAX, CvType.CV_32F);
// 绘制角点
dst.create(src.size(), src.type());
src.copyTo(dst);
float[] data = new float[1];
for(int j=0; j<response_norm.rows(); j++ )
{
for(int i=0; i<response_norm.cols(); i++ )
{
response_norm.get(j, i, data);
if((int)data[0] > 100)
{
Imgproc.circle(dst, new Point(i, j), 5, new Scalar(0, 0, 255), 2, 8, 0);
Log.i("Harris Corner", "find corner point...");
}
}
}
gray.release();
response.release();
}
private void shiTomasicornerDemo(Mat src, Mat dst) {
// 变量定义
double k = 0.04;
int blockSize = 3;
double qualityLevel= 0.01;
boolean useHarrisCorner = false;
// 角点检测
Mat gray = new Mat();
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
MatOfPoint corners = new MatOfPoint();
Imgproc.goodFeaturesToTrack(gray, corners, 100, qualityLevel, 10, new Mat(), blockSize, useHarrisCorner, k);
// 绘制角点
dst.create(src.size(), src.type());
src.copyTo(dst);
Point[] points = corners.toArray();
for(int i=0; i<points.length; i++) {
Imgproc.circle(dst, points[i], 5, new Scalar(0, 0, 255), 2, 8, 0);
}
gray.release();
}
AKAZE检测器与描述子
AKAZE特征算法是SIFT特征算法的一种改进版本,但不使用高斯模糊来构建尺度空间,因为高斯模糊具有丢失边缘信息的缺点,进而采用非线性扩散滤波来构建尺度空间,从而保留图像更多的边缘特征。
private void detectorDemo(Mat src, Mat dst, int type) {
FeatureDetector detector = null;
if(type == 1) {
detector = FeatureDetector.create(FeatureDetector.ORB);
} else if(type == 2) {
detector = FeatureDetector.create(FeatureDetector.BRISK);
} else if(type == 3) {
detector = FeatureDetector.create(FeatureDetector.FAST);
} else if(type == 4){
detector = FeatureDetector.create(FeatureDetector.AKAZE);
} else {
detector = FeatureDetector.create(FeatureDetector.HARRIS);
}
MatOfKeyPoint keyPoints = new MatOfKeyPoint();
detector.detect(src, keyPoints);
Features2d.drawKeypoints(src, keyPoints, dst);
}