什么是Hu矩
Hu矩是一种描述图像形状特征的数学工具,核心思想:提取图像的形状信息,并对这些信息进行归一化,使得它们对图像的平移、旋转和缩放具有不变性。简单说,Hu矩就是一串数字,这串数字可以唯一的描述图像的形状特征,而且不管图像怎么移动、旋转和缩放,这组数字都不变。
Hu矩的原理
1,几何矩:图像的像素值的加权和,可以用来描述图像的形状。如:零阶矩(面积):图像中所有像素值的总和;一阶矩(质心):图像的重心位置;二阶矩(方向):图像的伸展方向。
2,归一化中心矩:为了消除平移和缩放的影响,几何矩会被归一化,变成中心矩。
3,Hu矩:基于归一化的中心矩的7个不变组合,这7个矩对图像的平移、旋转和缩放都具有不变性。
Hu矩的公式
1. 原始矩(Spatial Moments)
原始矩是图像中各个像素值的加权和。对于二维图像 f(x,y)f(x, y)f(x,y),它的原始矩 mpqm_{pq}mpq 可以通过以下公式计算:
mpq=∑x∑yxpyqf(x,y)m_{pq} = \sum_x \sum_y x^p y^q f(x, y)mpq=x∑y∑xpyqf(x,y)
其中:
- m00m_{00}m00 是图像的零阶矩,代表图像的总质量(像素总和),即: m00=∑x∑yf(x,y)m_{00} = \sum_x \sum_y f(x, y)m00=x∑y∑f(x,y)
- m10m_{10}m10 和 m01m_{01}m01 是图像的质心(中心位置),分别表示图像的水平和垂直质心位置。
2. 中心矩(Central Moments)
为了消除图像的平移影响,使用中心矩来表示图像的特征。中心矩 μpq\mu_{pq}μpq 通过以下公式计算:
μpq=∑x∑y(x−xˉ)p(y−yˉ)qf(x,y)\mu_{pq} = \sum_x \sum_y (x - \bar{x})^p (y - \bar{y})^q f(x, y)μpq=x∑y∑(x−xˉ)p(y−yˉ)qf(x,y)
其中 xˉ\bar{x}xˉ 和 yˉ\bar{y}yˉ 是图像的质心坐标,定义为:
xˉ=m10m00,yˉ=m01m00\bar{x} = \frac{m_{10}}{m_{00}}, \quad \bar{y} = \frac{m_{01}}{m_{00}}xˉ=m00m10,yˉ=m00m01
3. 标准化中心矩(Normalized Central Moments)
为了消除尺度影响,使用标准化的中心矩来表示图像的特征,标准化中心矩 ηpq\eta_{pq}ηpq 通过以下公式计算:
ηpq=μpqm001+p+q2\eta_{pq} = \frac{\mu_{pq}}{m_{00}^{1 + \frac{p+q}{2}}}ηpq=m001+2p+qμpq
4. Hu矩公式
Hu矩是基于标准化中心矩的组合,通常有7个不变矩。Hu在1959年提出了以下7个不变矩,作为对图像形状的描述:
η1=η20+η02\eta_1 = \eta_{20} + \eta_{02}η1=η20+η02
η2=(η20−η02)2+4η112\eta_2 = (\eta_{20} - \eta_{02})^2 + 4\eta_{11}^2η2=(η20−η02)2+4η112
η3=(η30−3η12)2+(3η21−η03)2\eta_3 = (\eta_{30} - 3\eta_{12})^2 + (3\eta_{21} - \eta_{03})^2η3=(η30−3η12)2+(3η21−η03)2
η4=(η30+η12)2+(η21+η03)2\eta_4 = (\eta_{30} + \eta_{12})^2 + (\eta_{21} + \eta_{03})^2η4=(η30+η12)2+(η21+η03)2
η5=(η30−3η12)(η30+η12)[(η21+η03)2−(η21−η03)2]\eta_5 = (\eta_{30} - 3\eta_{12}) (\eta_{30} + \eta_{12}) \left[ (\eta_{21} + \eta_{03})^2 - (\eta_{21} - \eta_{03})^2 \right]η5=(η30−3η12)(η30+η12)[(η21+η03)2−(η21−η03)2]
η6=(η20−η02)[(η30+η12)2−(η21+η03)2]\eta_6 = (\eta_{20} - \eta_{02}) \left[ (\eta_{30} + \eta_{12})^2 - (\eta_{21} + \eta_{03})^2 \right]η6=(η20−η02)[(η30+η12)2−(η21+η03)2]
η7=(3η21−η03)(η30+η12)[(η21+η03)2−(η21−η03)2]\eta_7 = (3\eta_{21} - \eta_{03}) (\eta_{30} + \eta_{12}) \left[ (\eta_{21} + \eta_{03})^2 - (\eta_{21} - \eta_{03})^2 \right]η7=(3η21−η03)(η30+η12)[(η21+η03)2−(η21−η03)2]
这些7个Hu矩提供了一个不变特征集,可以用于图像的匹配、分类等应用,且对平移、旋转和尺度具有不变性。
Hu矩的应用场景
1,图像识别:如手写数字、字母、符号等,通过Hu矩,可以提取图像的关键形状特征,然后与数据库中的特征进行匹配;
2,目标检测和跟踪:检测视屏中的某个目标,通过Hu矩描述目标的形状,来进行跟踪;
3,形状匹配:医学图像中,器官的形状;工业检测中,匹配零件的形状是否符合标准;
4,图像分类:根据
Hu矩的优缺点
优:
1,不变性:对图像的平移、旋转和缩放具有不变性,使得它在很多实际应用中非常有用;
2,简单高效:Hu矩的计算相对简单,计算速度快,适合实时处理;
3,形状描述能力强:Hu矩能很好地描述图像的全局形状特征;
缺:
1,对噪声敏感:如果图像有噪声,Hu矩的计算结果可能受到影响;
2,局部特征不足:Hu矩主要描述图像的全局形状特征,无法捕捉图像的局部细节;
3,对形状敏感:若发生拉伸、扭曲等,Hu矩的不变性可能会失效;
4,特征维度低:Hu矩只有7个特征值,对于复杂的形状描述可能不够;
总结
1,Hu矩是一种用于描述图像形状特征的工具,具有平移、旋转和缩放不变性;
2,它适用于图像识别、目标跟踪、形状匹配等场景;
3,优点:简单高效、不变性强,缺点:对噪声和形变敏感,且无法描述局部细节;
代码
#include
#include
int main() {
// 读取图像
cv::Mat image = cv::imread("shape.png", cv::IMREAD_GRAYSCALE);
if (image.empty()) {
std::cerr << "Error: Could not load image!" << std::endl;
return -1;
}
// 二值化图像(可选)
cv::Mat binary;
cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY);
// 计算图像的矩
cv::Moments m = cv::moments(binary, true);
// 计算 Hu矩
cv::Mat huMoments;
cv::HuMoments(m, huMoments);
// 输出 Hu矩
std::cout << "Hu Moments: \n";
for (int i = 0; i < huMoments.rows; i++) {
std::cout << huMoments.at(i) << std::endl;
}
return 0;
}