MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):
Posted wx62c4104564970
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):相关的知识,希望对你有一定的参考价值。
原图:
要得到的:
目的,是截取除眼睛那里的地方。
具体的照片以及参考代码:
思想:
目的是寻找眼睛,目前的知识就是关于投影之类的。无非是水平投影亦或者是垂直投影。
哪个方法可以寻找到单独的眼睛那里的区域就是可行的方法。
当然,彩色图不便于研究。转换为二值图:
但是,黑色的数值是0.不便于研究。所以进行倒置:
~:这个是取非的意思。就是倒置。
这样就可以啦。
接下来进行投影:
figure,imshow(bw);
figure,imshow(bw);
figure,imshow(bw);
说明奇数是进行倒置的!
下面是w’的投影。
投影就是,将该列上的所有数值相加!
白色极限:255
黑色:0
但是显示白色,并不都是255。可能是70,125之类的。
所以sum数值越大,白色就越多。
由图可知,眼睛位置就是那个最为宽大的地方!
接下来就是来找出那一段的具体坐标数值。
[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];是不断追加的意思!
注意符号:
cutab(:,2)-cutab(:,1):
接下来要找到最大的区域。
subab=cutab(:,2)-cutab(:,1);
这个是一个一维数组来存储上面的二维数组之间的差值。
下面就是找到最大数值:n来存储:最大数值。k:来存储行数。
[n,k]=max(subab);hre=bw(cutab(k,1):cutab(k,2)?;
代码分析的是倒置的图。就是上面找的最大的白色区域的下标。
找到对应的行数,第一个数到第二个数就是啦。
figure,imshow(hre)
下面就是对于眼睛再进一步截取啦。
就要用到find函数啦。
matlab中find 函数如何使用 具体就是存储所有非黑色点位置啦。
[~,c]=find(hre);
至于那个“~”符号,啥也没有。只有一个c来保存。
就是第一个碰到白色,和最后一个碰到白色的!
% rr=hre(:,min©:max©);%显示灰白图。
rr=f(cutab(k,1):cutab(k,2),min©:max©,:);
彩色图需要用三维数来显示!
OK。就这么多。
最后的结果:
我的代码:
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)
以上是关于MATLAB_no.2:关于眼睛的_cutab=[cutab;a b];_cutab(:,2)-cutab(:,1):的主要内容,如果未能解决你的问题,请参考以下文章