手势二值图提取5阶Hu矩特征,用matlab实现并作出详细解释
时间: 2023-06-01 12:04:02 浏览: 69
Hu矩MATLAB实现
5星 · 资源好评率100%
手势二值图提取5阶Hu矩特征的步骤如下:
1. 读取手势二值图像,并进行预处理,例如去噪、二值化等操作。
2. 计算图像的几何矩,包括0阶矩、1阶矩、2阶矩等。
3. 根据几何矩计算归一化中心距。
4. 计算Hu矩,包括1-7阶矩,其中第0阶矩是图像的面积,可以不计算。
5. 对Hu矩进行归一化处理,使其对图像旋转、平移、缩放等变化具有不变性。
6. 将5阶Hu矩作为手势的特征向量,用于分类或识别。
下面是用matlab实现手势二值图提取5阶Hu矩特征的示例代码:
```matlab
% 读取手势二值图像
img = imread('gesture.png');
% 预处理
img = im2bw(img, 0.5); % 二值化
img = bwareaopen(img, 50); % 去除小的连通域
% 计算几何矩
m00 = sum(sum(img));
m10 = sum(sum(bsxfun(@times, img, (1:size(img, 2))')));
m01 = sum(sum(bsxfun(@times, img, (1:size(img, 1))) ));
m20 = sum(sum(bsxfun(@times, bsxfun(@minus, (1:size(img, 2))', mean(1:size(img, 2))), bsxfun(@minus, (1:size(img, 2)), mean(1:size(img, 2)))', img)));
m02 = sum(sum(bsxfun(@times, bsxfun(@minus, (1:size(img, 1))', mean(1:size(img, 1))), bsxfun(@minus, (1:size(img, 1)), mean(1:size(img, 1)))', img)));
m11 = sum(sum(bsxfun(@times, bsxfun(@minus, (1:size(img, 2))', mean(1:size(img, 2))), bsxfun(@minus, (1:size(img, 1))', mean(1:size(img, 1)))', img)));
% 计算归一化中心距
mu20 = m20 / m00^2;
mu02 = m02 / m00^2;
mu11 = m11 / m00^2;
% 计算Hu矩
nu20 = mu20 / mu00^2;
nu02 = mu02 / mu00^2;
nu11 = mu11 / mu00^2;
nu30 = (mu30 / mu00^2) - 3 * nu20;
nu12 = (mu12 / mu00^2) - nu02;
nu21 = (mu21 / mu00^2) - nu02;
nu03 = (mu03 / mu00^2) - 3 * nu02;
% 归一化Hu矩
hu1 = nu20 + nu02;
hu2 = (nu20 - nu02)^2 + 4 * nu11^2;
hu3 = (nu30 - 3 * nu12)^2 + (3 * nu21 - nu03)^2;
hu4 = (nu30 + nu12)^2 + (nu21 + nu03)^2;
hu5 = (nu30 - 3 * nu12) * (nu30 + nu12) * ((nu30 + nu12)^2 - 3 * (nu21 + nu03)^2) + (3 * nu21 - nu03) * (nu21 + nu03) * (3 * (nu30 + nu12)^2 - (nu21 + nu03)^2);
hu = [hu1, hu2, hu3, hu4, hu5];
% 显示手势图像和Hu矩特征
figure(1);
subplot(1, 2, 1); imshow(img); title('Gesture');
subplot(1, 2, 2); bar(hu); title('Hu Moments');
```
该代码首先读取手势二值图像,然后进行预处理,包括二值化和去除小的连通域。接着计算图像的几何矩和归一化中心距,然后计算5阶Hu矩并进行归一化处理。最后,将Hu矩特征向量显示出来。
阅读全文