Обнаружение лиц на основе цвета и формы Matlab
Нужно было изменить алгоритм обработки лиц на основе цвета для Matlab R2020a, взятый с Экспоненты
clear;
%Считывание исходного изображения
L=imread('kids.bmp');
%L=imread('im.jpg');
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);title('Исходное изображение');
%Выбор пикселей лица с характерным цветом
[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1));
g=median(z(:,2)); std_g=std(z(:,2));
b=median(z(:,3)); std_b=std(z(:,3));
%Сегментация на основе анализа цвета
for i=1:N;
disp(i);
for j=1:M;
if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)<std_b);
L1(i,j)=1;
else
L1(i,j)=0;
end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');
imwrite(L1,'Исходное изображение после сегментации.jpg');
%Удаление объектов, площадь которых меньше
некоторой заданной величины (для удаления шума)
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
Areas(i)=feats(i).Area;
end;
idx=find(Areas>5750);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');
L1=1-L1;
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
Areas(i)=feats(i).Area;
end;
idx=find(Areas>5750);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);title('После удаления шума (небольших объектов)');
%STATS = regionprops(L1,'Eccentricity');
Lmitky = bwlabel(L1,4);
figure,imshow(Lmitky);
imwrite(Lmitky,'Изображение меток.jpg');
figure, imshow(L);
H=hist(Lmitky(:),max(max(Lmitky)));
Nomer=find(H>4000);
for r=2:length(Nomer);
MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0;
for i=1:N;
for j=1:M;
if Lmitky(i,j)==Nomer(r);
if i<MIN_i;
MIN_i=i;
end;
if j<MIN_j;
MIN_j=j;
end;
if i>MAX_i;
MAX_i=i;
end;
if j>MAX_j;
MAX_j=j;
end;
end;
end;
end;
line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
line([MAX_j MAX_j],[MIN_i MAX_i]);
line([MAX_j MIN_j],[MAX_i MAX_i]);
line([MIN_j MIN_j],[MIN_i MAX_i]);hold off;
end;
Измененный код:
clear;
%Считывание исходного изображения
L=imread('image.jpg');
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);
title('Исходное изображение');
%Выбор пикселей лица с характерным цветом
[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1));
g=median(z(:,2)); std_g=std(z(:,2));
b=median(z(:,3)); std_b=std(z(:,3));
%Сегментация на основе анализа цвета
for i=1:N;
disp(i);
for j=1:M;
if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)<std_b);
L1(i,j)=1;
else
L1(i,j)=0;
end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');
imwrite(L1,'Исходное изображение после сегментации.jpg');
%Удаление объектов, площадь которых меньше некоторой заданной величины (для удаления шума)
[mitka num]=bwlabel(L1,8);
feats=regionprops(mitka,'Area');
Areas=zeros(num);
for i=1:num;
Areas(i)=feats(i).Area;
end;
idx=find(Areas>1000);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');
L1=1-L1;
[mitka num]=bwlabel(L1,8);
feats=regionprops(mitka,'Area');
Areas=zeros(num);
for i=1:num;
Areas(i)=feats(i).Area;
end;
idx=find(Areas>1000);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);title('После удаления шума (небольших объектов)');
%STATS = regionprops(L1,'Eccentricity');
Lmitky = bwlabel(L1,4);
figure,imshow(Lmitky);
imwrite(Lmitky,'Изображение меток.jpg');
figure, imshow(L);
H=hist(Lmitky(:),max(max(Lmitky)));
Nomer=find(H>1000);
for r=2:length(Nomer);
MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0;
for i=1:N;
for j=1:M;
if Lmitky(i,j)==Nomer(r);
if i<MIN_i;
MIN_i=i;
end;
if j<MIN_j;
MIN_j=j;
end;
if i>MAX_i;
MAX_i=i;
end;
if j>MAX_j;
MAX_j=j;
end;
end;
end;
end;
line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
line([MAX_j MAX_j],[MIN_i MAX_i]);
line([MAX_j MIN_j],[MAX_i MAX_i]);
line([MIN_j MIN_j],[MIN_i MAX_i]);hold off;
end;
В 53 строчке есть закомментированный код:
%STATS = regionprops(L1,'Eccentricity');
Как я понимаю, это наводка на фильтр - лицо должно быть округлым. Подскажите пожалуйста, как правильно включить этот фильтр?