原图:
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_正常运行](https://file.cfanz.cn/uploads/png/2022/07/12/11/1D3J100578.png)
要得到的:
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_正常运行_02](https://file.cfanz.cn/uploads/png/2022/07/12/11/V6ebU326OD.png)
目的,是截取除眼睛那里的地方。
具体的照片以及参考代码:
思想:
目的是寻找眼睛,目前的知识就是关于投影之类的。无非是水平投影亦或者是垂直投影。
哪个方法可以寻找到单独的眼睛那里的区域就是可行的方法。
当然,彩色图不便于研究。转换为二值图:
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_正常运行_03](https://file.cfanz.cn/uploads/png/2022/07/12/11/H77800514Q.png)
但是,黑色的数值是0.不便于研究。所以进行倒置:
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_MATLAB_no.2:关于眼睛的._04](https://file.cfanz.cn/uploads/png/2022/07/12/11/699439CKT8.png)
~:这个是取非的意思。就是倒置。
这样就可以啦。
接下来进行投影:
figure,imshow(bw');
figure,imshow(bw'');
figure,imshow(bw''');
说明奇数是进行倒置的!
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_MATLAB_no.2:关于眼睛的._05](https://file.cfanz.cn/uploads/png/2022/07/12/11/JNFb7CI170.png)
下面是w’的投影。
投影就是,将该列上的所有数值相加!
白色极限:255
黑色:0
但是显示白色,并不都是255。可能是70,125之类的。
所以sum数值越大,白色就越多。
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_代码分析_06](https://file.cfanz.cn/uploads/png/2022/07/12/11/27758d6c27.png)
由图可知,眼睛位置就是那个最为宽大的地方!
接下来就是来找出那一段的具体坐标数值。
[h,w]=size(bw);
这里说一下,因为编程很容易出现超出范围。所以,只好限制。通过图形的宽和高。
上面这个是有错误之后,才知道的!
具体编程,由于一开始就是0.只能从0开始入手。
while(a<h)
while(ws(a)==0&&a<h)
a=a+1;
end
b=a;
while(ws(b)>0)
b=b+1;
end
cutab=[cutab;a b];
a=b;
end
这段代码就是存储一段两边都不是零的区域的起始点与终止点。
还要保证正常运行就出现啦上面的代码啦!
其中:cutab=[cutab;a b];是不断追加的意思!
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_MATLAB_no.2:关于眼睛的._07](https://file.cfanz.cn/uploads/png/2022/07/12/11/ccDPeX4WI3.png)
注意符号:
![ [点击并拖拽以移动] MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_MATLAB_no.2:关于眼睛的._08](https://file.cfanz.cn/uploads/png/2022/07/12/11/Yb30A0C4ML.png)
cutab(:,2)-cutab(:,1):
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_代码分析_09](https://file.cfanz.cn/uploads/png/2022/07/12/11/FNF7e29V2D.png)
接下来要找到最大的区域。
subab=cutab(:,2)-cutab(:,1);
这个是一个一维数组来存储上面的二维数组之间的差值。
下面就是找到最大数值:n来存储:最大数值。k:来存储行数。
[n,k]=max(subab);hre=bw(cutab(k,1):cutab(k,2)?;
代码分析的是倒置的图。就是上面找的最大的白色区域的下标。
找到对应的行数,第一个数到第二个数就是啦。
figure,imshow(hre)
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_代码分析_10](https://file.cfanz.cn/uploads/png/2022/07/12/11/939GGQYD6d.png)
下面就是对于眼睛再进一步截取啦。
就要用到find函数啦。
matlab中find 函数如何使用 具体就是存储所有非黑色点位置啦。
[~,c]=find(hre);
至于那个“~”符号,啥也没有。只有一个c来保存。
就是第一个碰到白色,和最后一个碰到白色的!
% rr=hre(:,min©:max©);%显示灰白图。
rr=f(cutab(k,1):cutab(k,2),min©:max©,:);
彩色图需要用三维数来显示!
OK。就这么多。
最后的结果:
![在这里插入图片描述 MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):_一维数组_11](https://file.cfanz.cn/uploads/png/2022/07/12/11/V6ebU326OD.png)
我的代码:
clc,clear,close all
f=imread('eye.jpg');
bw=~im2bw(f);
imshow(bw);
imshow(f);
figure,imshow(bw');
ws=sum((bw'));
figure,plot(ws);
a=1;b=1;cutab=[];t=[];
[h,w]=size(bw);
while(a<h)
while(ws(a)==0&&a<h)
a=a+1;
end
b=a;
while(ws(b)>0)
b=b+1;
end
cutab=[cutab;a b];
a=b;
end
subab=cutab(:,2)-cutab(:,1);
[n,k]=max(subab);
hre=bw(cutab(k,1):cutab(k,2),:);
[~,c]=find(hre);
% rr=hre(:,min(c):max(c));%显示灰白图。
rr=f(cutab(k,1):cutab(k,2),min(c):max(c),:);
figure,imshow(rr)










