空灵学院

 找回密码
 立即注册

扫一扫,访问微社区

搜索
查看: 2061|回复: 0

基于Matlab的简单人脸识别实例

[复制链接]

1137

主题

1761

帖子

7558

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7558
发表于 2014-1-20 10:34:35 | 显示全部楼层 |阅读模式
以下内容摘自好友lyqmath新浪博客,在此借花献佛。

前言
有关二进制格式的读写文件,曾困扰我一段时间,现将自己的一点想法写出来,希望能对大家有所帮助。
所谓二进制格式读写,个人认为其核心是“按指定数据类型大小读写内存”,所以其特殊之处应该在于读写时要指定数据类型。
内容
这里通过对人脸图像打上网格,对区域块图像做二值分析,通过像素比例来做处理。进而得到人脸区域。
代码

  1. % By lyqmath
  2. % DLUT School of Mathematical Sciences 2008
  3. % BLOG:http://blog.sina.com.cn/lyqmath
  4. clc; clear all; close all;
  5. % 载入图像
  6. Img = imread('face.jpg');
  7. if ndims(Img) == 3
  8.     I=rgb2gray(Img);
  9. else
  10.     I = Img;
  11. end
  12. BW = im2bw(I, graythresh(I)); % 二值化
  13. figure;
  14. subplot(2, 2, 1); imshow(Img);
  15. title('原图像', 'FontWeight', 'Bold');
  16. subplot(2, 2, 2); imshow(Img);
  17. title('网格标记图像', 'FontWeight', 'Bold');
  18. hold on;
  19. [xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ...
  20.     round(linspace(1, size(I, 2), 10)));
  21. mesh(yt, xt, zeros(size(xt)), 'FaceColor', ...
  22.     'None', 'LineWidth', 3, ...
  23.     'EdgeColor', 'r');
  24. subplot(2, 2, 3); imshow(BW);
  25. title('二值图像', 'FontWeight', 'Bold');
  26. [n1, n2] = size(BW);
  27. r = floor(n1/10); % 分成10块,行
  28. c = floor(n2/10); % 分成10块,列
  29. x1 = 1; x2 = r; % 对应行初始化
  30. s = r*c; % 块面积
  31. for i = 1:10
  32.     y1 = 1; y2 = c; % 对应列初始化
  33.     for j = 1:10
  34.         if (y2<=c || y2>=9*c) || (x1==1 || x2==r*10)
  35.             % 如果是在四周区域
  36.             loc = find(BW(x1:x2, y1:y2)==0);
  37.             [p, q] = size(loc);
  38.             pr = p/s*100; % 黑色像素所占的比例数
  39.             if pr <= 100
  40.                 BW(x1:x2, y1:y2) = 0;
  41.             end
  42.         end
  43.         y1 = y1+c; % 列跳跃
  44.         y2 = y2+c; % 列跳跃
  45.     end
  46.     x1 = x1+r; % 行跳跃
  47.     x2 = x2+r; % 行跳跃
  48. end
  49. [L, num] = bwlabel(BW, 8); % 区域标记
  50. stats = regionprops(L, 'BoundingBox'); % 得到包围矩形框
  51. Bd = cat(1, stats.BoundingBox);
  52. [s1, s2] = size(Bd);
  53. mx = 0;
  54. for k = 1:s1
  55.     p = Bd(k, 3)*Bd(k, 4); % 宽*高
  56.     if p>mx && (Bd(k, 3)/Bd(k, 4))<1.8
  57.         % 如果满足面积块大,而且宽/高<1.8
  58.         mx = p;
  59.         j = k;
  60.     end
  61. end
  62. subplot(2, 2, 4);imshow(I); hold on;
  63. rectangle('Position', Bd(j, :), ...
  64.     'EdgeColor', 'r', 'LineWidth', 3);
  65. title('标记图像', 'FontWeight', 'Bold');
复制代码
结果

总结
通过对人脸图像做二值化,统计像素比例信息。得到人脸识别结果。当然,
这种方式处理并不稳定,但基于图像网格分析做处理,进而得到分析结果也是一
种经典的处理方式。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|空灵学院 ( 11033542 )

GMT+8, 2024-5-7 02:07 , Processed in 0.030424 second(s), 27 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表