📄 segproc1.m
字号:
% function cellarea=preprocessing(image,mheig,mwid,cof)
image=wwx([1200,1600,1200,1700]);
if ~isa(image,'uint8')
image=uint8(image);
end
m=size(image,1);
n=size(image,2);
bwimage=im2bw(image);
se=ones(3,3);
seh=ones(1,3);
bwimage=dilate(bwimage,seh,5);
bwimage=~(bwimage);
bwimage=dilate(bwimage,seh,5);
bwimage=~(bwimage);
bwimage=erode(bwimage,seh);
bwimage=dilate(bwimage,seh);
flag=repmat(logical(uint8(0)),m,n);
for i=1:m
aa=bwimage(i,1:n-1);
bb=bwimage(i,2:n);
ss=xor(aa,bb);
idxone=find(ss==1);
if isempty(idxone)
flag(i,:)=1;
else
long=length(idxone);
if idxone(1)>=80 & aa(idxone(1))==1
flag(i,1:idxone(1))=1;
elseif idxone(1)>=200 & aa(idxone(1))==0
flag(i,1:idxone(1))=1;
end
if n-idxone(long)>=80 & aa(idxone(long)+1)==1
flag(i,idxone(long)+1:n)=1;
elseif n-idxone(long)>=200 & aa(idxone(long)+1)==0
flag(i,idxone(long)+1:n)=1;
end
if long>1
for kk=1:length(idxone)-1
if idxone(kk+1)-idxone(kk)>=80 & aa(idxone(kk)+1)==1
flag(i,idxone(kk)+1:idxone(kk+1))=1;
elseif idxone(kk+1)-idxone(kk)>=200 & aa(idxone(kk)+1)==0
flag(i,idxone(kk)+1:idxone(kk+1))=1;
end
end
end
end
end
sev=ones(3,1);
se=ones(3,3);
flag=erode(flag,sev,2);
flag=dilate(flag,sev,2); % vertical openning operation
flag=dilate(flag,se,6);
flag=~flag;
flag=dilate(flag,se,6);
flag=~flag; % square closing operation
flag=erode(flag,sev,12);
flag=dilate(flag,sev,12); % vertical openning operation
flag=dilate(flag,se,18);
flag=~(flag);
flag=dilate(flag,se,25); % squrar closing operation and erosion operation
flag=dilate(flag,seh,40);
flag=~(flag); % horizon erosion operation
flag=bwmorph(flag,'open');
cellarea=[];
step=min(fix(mwid/2),60);
for i=50:step:n-50
if i==50
proc=flag(:,i);
else
proc=proc&flag(:,i);
end
end
aa=proc(1:m-1);
bb=proc(2:m);
cc=xor(aa,bb);
p1=find(cc==1);
if ~isempty(p1)
if proc(1)==0,p1=[1;p1];end
if proc(m)==0,p1=[p1;m];end
for i=2:2:length(p1)
if p1(i)-p1(i-1)>=mheig
flagpart=flag(p1(i-1):p1(i),:);
fph=size(flagpart,1);
for j=1:10:fph
if j==1,pror=flagpart(j,:);else,pror=pror&flagpart(j,:);end
end
dd=pror(1:n-1);
ff=pror(2:n);
hh=xor(dd,ff);
q1=find(hh==1);
if isempty(q1)
cellarea=[cellarea;p1(i-1),p1(i),1,n];
else
if pror(1)==0,q1=[1,q1];end
if pror(n)==0,q1=[q1,n];end
for j=2:2:length(q1)
if q1(j)-q1(j-1)>=mwid
cellarea=[cellarea;p1(i-1),p1(i),q1(j-1),q1(j)];
end
end
end
end
end
else
if proc(1)==0,cellarea=[1,m,1,n];end
end
if ~isempty(cellarea) & cellarea(1,2)-cellarea(1,1)+1<m
for i=1:size(cellarea,1)
hh=cellarea(i,2)-cellarea(i,1)+1;
if hh>mheig*1.4 | (hh>mheig*1.15 & (cellarea(i,1)==1|cellarea(i,2)==m))
flagp=flag(cellarea(i,1):cellarea(i,2),cellarea(i,3):cellarea(i,4));
upc=length(find(flagp(20,:)==0));
downc=length(find(flagp(hh-20,:)==0));
long=cellarea(i,4)-cellarea(i,3)+1;
for j=5:20:long-5
if j==5,aa=flagp(:,j);else,aa=aa|flagp(:,j);end
end
zero=find(aa==0);
lu=zero(1);
if lu>mheig*.15 & lu<mheig*.3 & upc<long*.5
cellarea(i,1)=cellarea(i,1)+fix(lu*.25);
elseif lu>=mheig*.3 & upc<long*.5
cellarea(i,1)=cellarea(i,1)+fix(lu*.4);
end
ld=hh-zero(length(zero));
if ld>mheig*.15 & ld<mheig*.3 & downc<long*.5
cellarea(i,2)=cellarea(i,2)-fix(ld*.25);
elseif ld>=mheig*.3 & downc<long*.5
cellarea(i,2)=cellarea(i,2)-fix(ld*.4);
end
if cellarea(i,1)>1 & cellarea(i,2)<n
ih=cellarea(i,2)-cellarea(i,1);
if ih<mheig*1.3
step=fix((mheig*1.3-ih)/2);
if cellarea(i,1)>1+step
cellarea(i,1)=cellarea(i,1)-step;
else
cellaeea(i,1)=1;
end
if cellarea(i,2)<m-step
cellarea(i,2)=cellarea(i,2)+step;
else
cellaeea(i,2)=m;
end
end
end
if cellarea(i,3)~=1
if cellarea(i,3)>25
cellarea(i,3)=cellarea(i,3)-25;
else
cellarea(i,3)=1;
end
end
if cellarea(i,4)~=n
if cellarea(i,4)<n-25
cellarea(i,4)=cellarea(i,4)+25;
else
cellarea(i,4)=n;
end
end
end
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -