function [img, faces_num] = DetectFace(img, face_feature, L, similarity_threshold, area_threshold, row_width, col_width, step, least_face_area)
x_less = [];
y_large = [];
i = row_width;
while i <= size(img, 1)
j = col_width;
while j <= size(img, 2)
feat_temp = get_face_feat(img(i - row_width + 1: i, j - col_width + 1: j, :), L);
dist = 1 - sum(sqrt(feat_temp .* face_feature));
if dist < similarity_threshold
x_less = [x_less, i - row_width + 1];
y_large = [y_large, j];
end
j = j + step;
end
i = i + step;
end
x_large = x_less + (row_width - 1);
y_less = y_large - (col_width - 1);
% combine blocks
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
for j = i + 1: 1: length(x_less)
if j ~= i && x_less(j) ~= -1
if x_less(i) == x_less(j)
if y_less(j) <= y_large(i) + col_width && y_less(j) >= y_less(i)
y_large(i) = y_large(j);
x_large(i) = max(x_large(i), x_large(j));
x_less(j) = -1;
end
end
if y_less(i) == y_less(j)
if x_less(j) <= x_large(i) + row_width && x_less(j) >= x_less(i)
x_large(i) = x_large(j);
y_large(i) = max(y_large(i), y_large(j));
x_less(j) = -1;
end
end
end
end
end
end
% remove overlap blocks
face_idx_1 = x_less ~= -1;
x_less = x_less(face_idx_1);
x_large = x_large(face_idx_1);
y_less = y_less(face_idx_1);
y_large = y_large(face_idx_1);
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
area_i = (x_large(i) - x_less(i)) * (y_large(i) - y_less(i));
for j = 1: 1: length(x_less)
if j ~= i && x_less(j) ~= -1
if x_less(j) <= x_large(i) && x_less(j) >= x_less(i) && y_less(j) <= y_large(i) && y_less(j) >= y_less(i)
area_overlap = (min(x_large(i), x_large(j)) - x_less(j)) * (min(y_large(i), y_large(j)) - y_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif x_less(j) >= x_less(i) && x_less(j) <= x_large(i) && y_less(i) <= y_less(j) && y_large(i) >= y_large(j)
area_overlap = (min(x_large(i), x_large(j)) - x_less(j)) * (y_large(j) - y_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif y_less(j) >= y_less(i) && y_less(j) <= y_large(i) && x_less(i) <= x_less(j) && x_large(i) >= x_large(j)
area_overlap = (min(y_large(i), y_large(j)) - y_less(j)) * (x_large(j) - x_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif x_large(j) >= x_less(i) && x_large(j) <= x_large(i) && y_less(i) <= y_less(j) && y_large(i) >= y_large(j)
area_overlap = (x_large(j) - max(x_less(i), x_less(j))) * (y_large(j) - y_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif y_large(j) >= y_less(i) && y_large(j) <= y_large(i) && x_less(i) <= x_less(j) && x_large(i) >= x_large(j)
area_overlap = (y_large(j) - max(y_less(i), y_less(j))) * (x_large(j) - x_less(j));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
elseif x_less(j) >= x_less(i) && x_large(j) <= x_large(i) && y_less(i) >= y_less(j) && y_large(i) <= y_large(j)
area_overlap = (x_large(j) - x_less(j)) * (y_large(i) - y_less(i));
if area_overlap / area_i >= area_threshold
x_less(j) = -1;
end
end
end
end
end
end
% remove small blocks
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
if (x_large(i) - x_less(i)) * (y_large(i) - y_less(i)) <= least_face_area
x_less(i) = -1;
end
end
end
% optimize rectangle blocks
for i = 1: 1: length(x_less)
if x_less(i) ~= -1
delta_x = x_large(i) - x_less(i);
delta_y = y_large(i) - y_less(i);
if delta_x - delta_y > delta_x / 2
delta = floor((delta_x - delta_y) / 8);
x_less(i) = x_less(i) + delta;
x_large(i) = x_large(i) - 3 * delta;
y_less(i) = max(y_less(i) - 2 * delta, 1);
y_large(i) = min(y_large(i) + 2 * delta, size(img, 2));
elseif delta_y - delta_x > delta_y / 2
delta = floor((delta_y - delta_x) / 4);
y_less(i) = y_less(i) + 2 * delta;
y_large(i) = y_large(i) - 2 * delta;
x_less(i) = max(x_less(i) - 2 * delta, 1);
x_large(i) = min(x_large(i) + 2 * delta, size(img, 1));
end
end
end
faces_num = sum(x_less ~= -1);
rect_face = logical(zeros(size(img)));
edge = 1;
for i = 1 : 1 : length(x_less)
if x_less(i) ~= -1
rect_face(max(x_less(i) - edge, 1): x_less(i) + edge, y_less(i) : y_large(i), 1) = true;
rect_face(x_large(i) - edge: min(size(img, 1), x_large(i) + edge), y_less(i) : y_large(i), 1) = true;
rect_face(x_less(i): x_large(i), max(1, y_less(i) - edge): y_less(i) + edge, 1) = true;
rect_face(x_less(i): x_large(i), y_large(i) - edge: min(size(img, 2), y_large(i) + edge), 1) = true;
end
end
img(rect_face) = uint8(255);
end
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
## 一、实验目的 1. 了解计算机储存和处理图像的基础知识 2. 理解 JPEG 标准的基本原理,变换域编码和量化的基本思想,掌握 MATLAB 处理矩阵和图像的常用命令 3. 理解变换域信息隐藏的基本方法 4. 掌握基于肤色的人脸检测算法 ## 二、实验平台 我的所有代码均在 MATLAB R2020b 版本上成功运行 ## 三、实验内容 ### 3.1 图像基础知识 #### (1)在图像中画圆 首先确定圆的圆心,为测试图像的中心;然后确定圆的半径,为图像长、宽中的较小值。接下来根据圆的定义画圆:所有与圆心的距离等于半径的点构成一个圆。在这里,为了让画出的圆清晰可见,将所有与圆心距离在 0.98~1.02 倍半径之间的点全部标红,呈现在图像上。取出标红点的关键代码如下: #### (2)将测试图像涂成国际象棋状的“黑白格” 将测试图像分成 8*8 的区域,然后对每块区域根据国际象棋“黑白格”的规则染色。在黑色的地方,将原图对应区域置为0;白色的地方则保持不变。结果如下 ### 3.2 图像压缩编码 #### (1)在变换域预处理 图像的预处理是将每个像素灰度值
资源推荐
资源详情
资源评论
收起资源包目录
Image-Processing.zip (96个子文件)
Image-Processing
src
hw4_3_1.m 522B
inv_zig_zag.m 830B
hw1_3_2.m 2KB
hw2_4_5.m 108B
get_face_feat.m 545B
hw2_4_12.m 710B
hw2_4_9.m 286B
dct_conceal_1.m 2KB
hw2_4_3.m 982B
dct_reveal_1.m 3KB
hw2_4_8.m 462B
DCT2_D.m 284B
hw2_4_11.m 693B
Compress.m 2KB
dct_conceal_2.m 2KB
hw3_4_2.m 3KB
hw4_3_3.m 1012B
dct_conceal_3.m 2KB
hw3_4_1.m 584B
hw2_4_10.m 313B
zig_zag.m 449B
DetectFace.m 6KB
dct_reveal_3.m 3KB
hw2_4_2.m 333B
hw4_3_2.m 1KB
hw2_4_7.m 489B
.gitignore 11B
train_face.m 360B
dct_reveal_2.m 3KB
hw2_4_13.m 685B
hw2_4_1.m 605B
jpegcodes.mat 4KB
DCT2.m 150B
hw2_4_4.m 1KB
Decompress.m 3KB
图像处理所需资源
.DS_Store 10KB
hall.mat 74KB
JpegCoeff.mat 665B
test1.png 533KB
test2.png 742KB
snow.mat 18KB
Faces
21.bmp 6KB
6.bmp 4KB
.DS_Store 8KB
7.bmp 3KB
16.bmp 558KB
31.bmp 9KB
13.bmp 8KB
29.bmp 10KB
33.bmp 21KB
26.bmp 53KB
8.bmp 3KB
23.bmp 10KB
28.bmp 179KB
32.bmp 9KB
3.bmp 31KB
4.bmp 44KB
9.bmp 153KB
30.bmp 8KB
15.bmp 130KB
20.bmp 16KB
22.bmp 5KB
10.bmp 9KB
5.bmp 10KB
1.bmp 7KB
14.bmp 36KB
24.bmp 83KB
12.bmp 9KB
19.bmp 27KB
17.bmp 38KB
18.bmp 30KB
27.bmp 12KB
25.bmp 27KB
2.bmp 13KB
11.bmp 47KB
docs
实验报告.md 28KB
img
hw3_4_2_details.png 9KB
hw2_4_4.png 157KB
hw4_3_2_situ_2.png 3KB
detect_face_1.png 1.15MB
hw_1_3_2_circle.jpg 7KB
hw2_4_13.png 76KB
hw_1_3_2_chessboard.jpg 7KB
hw4_3_2_situ_3.png 11KB
hw4_3_2_situ_4.png 3KB
hw4_3_2_situ_1.png 2KB
hw3_4_2.png 139KB
hw2_4_3.png 63KB
hw2_4_5.png 25KB
doublewidth.png 463KB
hw4_3_1.png 23KB
adjustcolor.png 464KB
rot90.png 252KB
hw2_4_11.png 66KB
说明文档.md 28KB
.gitignore 12B
共 96 条
- 1
资源评论
振华OPPO
- 粉丝: 27w+
- 资源: 532
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功