1.算法仿真效果
Quartusii18.0+ModelSim-Altera 6.6d Starter Edition的测试结果如下:
MATLAB2022a测试结果如下:
2.算法涉及理论知识概要
在计算机视觉领域中,图像特征提取和图像配准是两个基本的问题。图像特征提取是指从图像中提取出具有代表性的特征点或特征描述子,以便于后续的图像处理,例如目标检测、目标跟踪、三维重建等。而图像配准则是指将两幅或多幅图像在空间上对齐,以便于进行后续的图像融合、图像拼接等操作。在这两个问题中,角点检测和描述子提取是其中的一个重要问题。
在图像中,角点通常指的是图像中边缘交汇的位置。角点是图像中最具有代表性的点之一,因为不同于直线和曲线,角点具有旋转不变性和尺度不变性,同时也具有较强的区分度。因此,角点在图像特征提取、目标检测等领域中得到了广泛应用。
在计算机视觉领域中,有很多种角点检测算法,其中比较经典的算法是Harris角点检测算法。Harris角点检测算法是由Chris Harris和Mike Stephens在1988年提出的,它通过计算图像中的像素点在不同方向上的灰度变化率来判断哪些点是角点。下面将详细介绍Harris角点检测算法的原理和实现。
图像配准是指将两幅或多幅图像在空间上对齐,以便于进行后续的图像融合、图像拼接等操作。在计算机视觉领域中,图像配准是一个非常重要的问题,它广泛应用于医学影像、遥感图像、工业检测等领域。图像配准的目标是找到两幅图像之间的对应点,从而将它们在空间上对齐。在寻找对应点的过程中,特征点的匹配是一个关键问题。
1 特征点匹配
在图像配准中,特征点匹配是一个重要的问题。特征点匹配是指将两幅图像中的特征点进行匹配,从而找到它们之间的对应关系。特征点匹配通常分为两个步骤:特征提取和特征匹配。特征提取是指从图像中提取出具有代表性的特征点或特征描述子。在前面介绍的Harris角点检测算法中,角点可以作为图像的特征点。此外,还有很多其他的特征点检测算法,例如SIFT、SURF、ORB等。这些算法都能够从图像中提取出具有代表性的特征点或特征描述子,用于后续的特征匹配。特征匹配是将两幅图像中的特征点进行匹配,从而找到它们之间的对应关系。特征匹配通常使用距离度量的方法进行,例如欧式距离、汉明距离等。在特征匹配中,需要确定一个阈值来判断两个特征点之间的匹配关系。如果两个特征点之间的距离小于阈值,那么它们就被认为是匹配的。
2 图像配准算法
图像配准算法主要分为基于特征的方法和基于区域的方法。基于特征的方法是一种广泛使用的图像配准方法,它利用图像中的特征点或特征描述子进行图像配准。基于特征的方法通常包括以下步骤:
提取两幅图像的特征点或特征描述子。
对两幅图像中的特征点或特征描述子进行匹配,找到它们之间的对应关系。
根据找到的对应关系,计算图像的变换矩阵。
对其中一幅图像进行变换,使得两幅图像在空间上对齐。
其中,步骤3和步骤4通常使用最小二乘法进行求解。最小二乘法是一种广泛使用的数学方法,用于求解线性方程组的最优解。在图像配准中,最小二乘法可以用于计算图像的变换矩阵,从而实现图像配准。
基于harrirs配准的模块主要包括角点提取功能、角点配准功能两大模块。其中,角点提取模块包括高斯滤波,Harris响应值计算以及非最大值抑制等功能。角点配准模块包括角点坐标值计算功能以及配准功能。因此,这个系统的结构如下图所示:
3.Verilog核心程序
```SDRAM_out SDRAM_out_u(
.i_clk (i_clk),
.i_rst (i_rst),
.o_images1(o_images1),
.o_images2(o_images2)
);
//select
wire[7:0]Images;
assign Images = o_images1;
//x方向滤波
fx_filter fx_filter_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_image (Images),
.o_image (o_fx)
);
//y方向滤波
fy_filter fy_filter_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_image (Images),
.o_image (o_fy)
);
//Ix2= Ix.^2;
//Iy2= Iy.^2;
//Ixy= Ix.*Iy;
Ix2Iy2 Ix2Iy2_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_Ix (o_fx),
.i_Iy (o_fy),
.o_Ix2 (o_Ix2),
.o_Iy2 (o_Iy2),
.o_IxIy (o_Ixy)
);
Rdet Rdet_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_Ix2 (o_Ix2),
.i_Iy2 (o_Iy2),
.i_Ixy (o_Ixy),
.o_det (o_det),
.o_trace (o_trace),
.o_R (o_R)
);
Rcheck Rcheck_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_R (o_R),
.o_Result1(o_Result1),
.o_Result2(o_Result2)
);
endmodule
```