网站开发设计流程图,软件平台化,化妆品网站模版免费下载,查域名注册人手势识别是智能设备常用的需求, 下面我们用MATLAB来识别手部的形态: 主程序main.m clc;clear all;close all;%清除命令行和窗口 imimread(DSC05815.JPG);
[skin,bwycbcr,w,h] hand_segmentation(im); im1bwycbcr; % se strel(ball,[1 1 1;1 1 1;1 1 1]); im1 imdilate(im…手势识别是智能设备常用的需求, 下面我们用MATLAB来识别手部的形态: 主程序main.m clc;clear all;close all;%清除命令行和窗口 imimread(DSC05815.JPG);
[skin,bwycbcr,w,h] hand_segmentation(im); im1bwycbcr; % se strel(ball,[1 1 1;1 1 1;1 1 1]); im1 imdilate(im1,[1 1 1;1 1 1;1 1 1]); figure; imshow(im1); title(Dilated); I_closed imageclose(im1); bw2imadjust(I_closed,[0,1]); %去除少像素连通区域 bw3bwareaopen(bw2,round(w*h/10)); figure; imshow(bw3); title(去除少数像素); sestrel(disk,5); I_closed2imclose(bw3,se); II_closed2; BW1edge(I,sobel); %用SOBEL算子进行边缘检测 BW2edge(I,roberts);%用Roberts算子进行边缘检测 BW3edge(I,prewitt); %用prewitt算子进行边缘检测 BW4edge(I,log); %用log算子进行边缘检测 BW5edge(I,canny); %用canny算子进行边缘检测 hfspecial(gaussian,5); BW6edge(I,canny); figure; subplot(2,3,1), imshow(BW1); title(sobel edge check); subplot(2,3,2), imshow(BW2); title(sobel edge check); subplot(2,3,3), imshow(BW3); title(prewitt edge check); subplot(2,3,4), imshow(BW4); title(log edge check); subplot(2,3,5), imshow(BW5); title(canny edge check); subplot(2,3,6), imshow(BW6); title(gasussiancanny edge check);%此为用高斯滤波后Canny算子边缘检测结果
r1im(:,:,1); b1im(:,:,2); g1im(:,:,3);
%% 判断边缘 [w1,h1,k43]size(im); for i1:w1 for j1:h1 if BW6(i,j)1%是边缘 % 用红色标出边缘 r1(i,j)255; b1(i,j)0; g1(i,j)0; end end end Iegdezeros(w1,h1,3); % 合成彩色图 Iegde(:,:,1)r1; Iegde(:,:,2)b1; Iegde(:,:,3)g1; Iegdedouble(Iegde/255);%转换为0-1彩色图 figure; imshow(Iegde);%绘制识别出来的图
子函数imageclose.m
%执行了先膨后胀腐蚀的闭运算 function I_closed imageclose(im1) %Iimread(result.bmp); sestrel(disk,3); I_closedimclose(im1,se); %subplot(1,2,1); %imshow(im1); figure; imshow(I_closed); title(闭运算后图像); %imwrite(I_opened,result1.bmp);
子函数 hand_segmentation.m
function [skin,bwycbcr,w,h] hand_segmentation(im) %imgrgbimread(IMG_2755.jpg); % imimread(DSC05818.JPG); [w h]size(im(:,:,1)); %Laplacian 八邻域模板滤波 h1[-1,-1,-1;-1,9,-1;-1,-1,-1]; bw1imfilter(im,h1); % bw1im; [m,n,c]size(bw1); % delete strFile,c; %将RGB色彩空间转换为Ycbcr色彩空间 imgrgb3rgb2ycbcr(bw1); yimgrgb3(:,:,1); cbimgrgb3(:,:,2); crimgrgb3(:,:,3); % %在Ycbcr色彩空间中分割肤色区域 cbdouble(cb); crdouble(cr); ydouble(y); bwycbcrzeros(m,n); for i1:m for j1:n if y(i,j)125 cb1108(125-y(i,j))*10/109; cr1154-(125-y(i,j))*10/109; wcb23(y(i,j)-16)*23.97/109; wcr20(y(i,j)-16)*18.76/109; cb1(cb(i,j)-cb1)*46.97/wcbcb1; cr1(cr(i,j)-cr1)*38.76/wcrcr1; elseif y(i,j)188 cb1108(y(i,j)-188)*10/47; cr1154(y(i,j)-188)*22/47; wcb14(235-y(i,j))*32.97/47; wcr10(235-y(i,j))*28.76/47; cb1(cb(i,j)-cb1)*46.97/wcbcb1; cr1(cr(i,j)-cr1)*38.76/wcrcr1; else cb1cb(i,j); cr1cr(i,j); end x1[-0.819 0.574]*[cb1-109.38;cr1-152.02]; y1[-0.574 -0.819]*[cb1-109.38;cr1-152.02]; if (x1-1.60).^2/644.6521(y1-2.41).^2/196.84091 bwycbcr(i,j)1; else bwycbcr(i,j)0; end end end %strWritestrcat(a,strFile1); %imwrite(bwycbcr,strWrite,jpg);
figure; %subplot(2,2,1); imshow(im); %title(原始图像); figure; %subplot(2,2,2); imshow(bw1); figure; %title(Laplacian滤波); %subplot(2,2,3); imshow(bwycbcr); % figure; %title(Ycbcr皮肤颜色模型); %subplot(2,2,4); %把bwycbcr拉伸到[0,1] bw2imadjust(bwycbcr,[0,1]); skinbw2; %去除少像素连通区域
skinbwareaopen(skin,round(w*h/1000)); % imshow(skin); % title(去除少数像素);
%imwrite(skin,result.bmp);
子函数Datafind_V1.m
function [Cpx_C_fft_new5]Datafind_V1(im4) %im5imread(result4.bmp); [Y X]size(im4); flag1;
%寻找链码的起始点 for k1:Y if flag0 break; end for kk1:X bim4(k,kk); if b1 p_xkk; p_yk; flag0; break; end end end imagesc(im4); colormap(gray);
flag1;
cur_xp_x; cur_yp_y; chainCode[p_y p_x]; im_bakim4; while flag1 im4(cur_y,cur_x)0; imblockim4(cur_y-1:cur_y1,cur_x-1:cur_x1); if sum(sum(imblock))0 if sum(sum(im4))0 | abs(cur_x-p_x)abs(cur_y-p_y)3 break; else im_bak(cur_y,cur_x)0; im4im_bak; cur_yp_y; cur_xp_x; chainCode[]; end else [n_y n_x]findNb(imblock); tmp[n_ycur_y n_xcur_x]; chainCode[chainCode; tmp]; cur_ytmp(1); cur_xtmp(2); end
end
%将链码出的边缘点组成复数点并做归一化的傅里叶变换 Cpx_CchainCode(:,1)chainCode(:,2)*i; Nlength(Cpx_C); Cpx_C_fft1/N*fft(Cpx_C); figure;plot(real(Cpx_C),imag(Cpx_C)); title(链码点plot图片); Cpx_C_fft_new5abs(Cpx_C_fft(2:11)); %save data5.mat Cpx_C_fft_new5 ; %Cpx_C_newifft(Cpx_C_fft_new1); %figure;plot(real(Cpx_C_new),imag(Cpx_C_new)); %BW10;
%Cpx_C_fft_newzeros(1,N); %Cpx_C_fft_new(1:BW1)Cpx_C_fft(1:BW1); %Cpx_C_fft_new(N-(BW-1):N)Cpx_C_fft(N-(BW-1):N); %Cpx_C_newifft(Cpx_C_fft_new); %figure;plot(real(Cpx_C_new),imag(Cpx_C_new)); 子函数boundary_trace.m
%function gboundary_trace(f) %gboundary_trace(f)跟踪目标的外边界f为输入的二值图像g为输出的二值图像 %此处f g都是认为是二维矩阵 【行 列】【y x】 %此算法只适用于二值图像 %fimread(result1.bmp); %去掉整幅图像四周围的像素点保证图像目标的连通性 function gboundary_trace(im2) [YS,XS]size(im2); im2(1,1:XS)0; im2(YS,1:XS)0; im2(1:YS,1)0; im2(1:YS,XS)0;
fim2bw(im2); imshow(im2); offsetr[-1,0,1,0]; offsetc[0,1,0,-1]; next_search_dir_table[4 1 2 3];%搜索方向查找表 next_dir_table[2 3 4 1];%搜索顺序查找表 start-1; boundary-2; %找出起始点 [rv,cv]find((f(2:end-1,:)0)(f(1:end-2,:)0)); %此处可以简化处理只用找出一个初始点即可。 rvrv1; startrrv(1); startccv(1); fim2double(f); f(startr,startc)start; cur_p[startr,startc]; init_dir-1; done0; next_dir2; %初始搜索方向 flag1; while~done dirnext_dir; found_neighbour0; for i1:length(offsetr) %四邻域上的寻找下一个边缘点 offset[offsetr(dir),offsetc(dir)]; neighbourcur_poffset; if(f(neighbour(1),neighbour(2)))~0 %找到新的边缘点 if(f(cur_p(1),cur_p(2))start)(init_dir-1) init_dirdir; %记下离开初始点时的方向 %当前点为初始点且新的边缘点的离开方向为初始离开方向表明跟踪过程已饶了一圈 elseif(f(cur_p(1),cur_p(2))start)(init_dirdir) done1; found_neighbour1; break; end next_dirnext_search_dir_table(dir); %下一个搜索方向 found_neighbour1; if f(neighbour(1),neighbour(2))~start f(neighbour(1),neighbour(2))boundary; end cur_pneighbour; break; end dirnext_dir_table(dir); end end bifind(fboundary); f(:)0; f(bi)1; f(startr,startc)1; gim2bw(f); figure,imshow(g); %title(边缘追踪后图像); %imwrite(g,result4.bmp);
%[Y,X]find(g); %corrzeros(2,length(X)); %corr(1,:)X; %corr(2,:)Y;
%frac_dim boxcount(corr, 10,1); 子函数boundary_thin.m
function i_new1boundary_thin(im3) %iimread(result47.bmp); %imshow(im3); %i_newi128; %i_new1bwmorph(i_new,thin);2 i_new1bwmorph(im3,thin); figure,imshow(i_new1); title(细化图像); %imwrite(i_new1,result5.bmp); 子函数adjustsize.m
function I_new1adjustsize(im1) %Iimread(result.bmp); %找到最左边和最右边灰度值不为1点的横坐标 Jsum(im1); msize(im1,2); for i1:m if J(i)~0 pi; break; else continue; end end for jm:-1:1 if J(j)~0 qj; break; else continue; end end %找到最左边和最右边灰度值不为1点的纵坐标 I1im1; J1sum(I1); nsize(I1,2); for k1:n if J1(k)~0 rk; break; else continue; end end for ln:-1:1 if J1(l)~0 sl; break; else continue; end end %剪切出以坐标点pr和qs组成的矩形区域 I_newimcrop(im1,[p r q-p s-r]); %figure,imshow(I_new); I_new1imresize(I_new,[150 150]); figure,imshow(I_new1); title(调整大小为150*150图像); 程序结果如下: 完整代码见:https://download.csdn.net/download/corn1949/88774968