cis581-presentation contour finding presented by: wang, qiang supervised by: dr. longin jan latecki
TRANSCRIPT
CIS581-Presentation
Contour finding
Presented by: Wang , Qiang
Supervised by: Dr. Longin Jan Latecki
Agenda
Introduction
Five steps to reach the goal
(processing the image)
Conclusion
Contour finding
Introduction
•Output: Sequence of boundary pixels of the largest object
•Input: Binary image containing segmented objects as black pixels
•Apply to MPEG-7 Shape 1 data set. (1400 images)
Introduction Sample images:
•Pre-processing: erase the noise•Edge detection•Contour detection•Delete the redundant points•Simplify the contours
Five steps:
Processing
Pre-processing Pre-processing: Erasing the noisefor num_bmp=1:1400 tmp=imread(strcat(int2str(num_bmp),'.bmp')); tmp=medfilt2(tmp,[10 10]); x = zeros(size(tmp,1)+6,size(tmp,2)+6); x(4:size(tmp,1)+3,4:size(tmp,2)+3)=tmp;
x=x~=0; x=im2bw(x); …End% some other choices of filters: % tmp=filter2(1/25*ones(5,5),tmp);% tmp=ordfilt2(tmp,36,ones(6,6));
Pre-processing Pre-processing: Erasing the noiseAnother way to erase the noise: Object LabelingFind out all those pixels connected to each other, and label them with the same number.
1 1 1 0 0 0 0 01 1 1 0 1 1 0 01 1 1 0 1 1 0 01 1 1 0 0 0 1 01 1 1 0 0 0 1 01 1 1 0 0 0 1 01 1 1 0 0 1 1 01 1 1 0 0 0 0 0
[labeled,numObjects] = bwlabel(bw,4)
1 1 1 0 0 0 0 01 1 1 0 2 2 0 01 1 1 0 2 2 0 01 1 1 0 0 0 0
1 1 1 0 0 0 3 01 1 1 0 0 0 3 01 1 1 0 0 3 3 01 1 1 0 0 0 0 0
Pre-processing Pre-processing: Erasing the noise
Edge detection
Edge detection Fortunately… there is a very useful function in matlab: img_edge=edge(
x);
Edge detection
Contour detection
Problem: after edge detection, we just get an image with all those points on the contour as 1 while all the others as 0,we need to get the coordinates of those 1 pixels (vertices).
Basic idea: just travel around all the contour, find out all the pixels of 1.
Contour detectionHow to travel??
•Need a starting point;•Need to decide the direction to travel;•Need to avoid any circle in traveling.
(The last one is the most tricky thing)
Contour detection
Solution:
A matrix and
a vector
Contour detection
The matrix: Anti-clockwise
[1 1 0 -1 -1 -1 0 1 for x 0 1 1 1 0 -1 -1 -1]; for y
Contour detection
The vector:
1 2 3 4 5 6 7 8 Current neighbor index
[8 8 2 2 4 4 6 6] New neighbor indexMake sure we know which one will be next neighbor to check!Keep anti-clockwise direction.
Contour detectionCode:
[a b]=find(img_edge); counter=size(find(img_edge),1); point_x(1)=a(1); point_y(1)=b(1); % find out the starting point neighbor_offset=[1 1 0 -1 -1 -1 0 1;0 1 1 1 0 -1 -1 -1]; new_neighbor=[8 8 2 2 4 4 6 6]; neighbor=1;
for i=1:counter %try to find out all those pixels on the contour while img_edge(point_x(i)+neighbor_offset(1,neighbor),point_y(i)+neighbor_offset(2,neighbor))==0 neighbor=mod(neighbor,8)+1; end
point_x(i+1)=point_x(i)+neighbor_offset(1,neighbor); point_y(i+1)=point_y(i)+neighbor_offset(2,neighbor); neighbor=new_neighbor(neighbor);
if and(point_x(1)==point_x(i+1),point_y(1)==point_y(i+1)) break end end
Contour detection
redundant points
Delete the redundant points When there are many points on exact the same straight line,
we just need to keep the starting and ending points.
for i=1:size(point_x,2)-2; if or(and(point_x(i)==point_x(i+1),point_x(i+1)==point_x(i+2)), and(point_y(i)==point_y(i+1),point_y(i+1)==point_y(i+2))) point_x(i+1)=[]; point_y(i+1)=[]; end end
Simplify the contour
for i1=1:n-pointsleftevomaass=evo(Zneu);%Function: computes a relvance measure for every point"[y,I]=sort(evomaass);Zneu(I(1))=[];% in Zneu the points with the smallest relevance measure is % removedend
Simplify the Contour: using a small number of edges to represent the contour.
Simplify the contour
function K=evo(Z)n=length(Z);LM=norm(Z(2)-Z(n));LR=norm(Z(1)-Z(2));LL=norm(Z(n-1)-Z(1));His(1)=LL+LR-LM;for j=2:n-1 LM=norm(Z(j-1)-Z(j+1)); LR=norm(Z(j)-Z(j+1)); LL=norm(Z(j-1)-Z(j)); His(j)=LL+LR-LM;end;LM=norm(Z(n-1)-Z(1));LR=norm(Z(n)-Z(1));LL=norm(Z(n-1)-Z(n));His(n)=LL+LR-LM;K=His;
Simplify the contour
Conclusion
input image: 512 * 512 pixels
Output file: 50 points
input size: 250 KB Output size: < 400 bytes
Based on the output: we can do•Image compression•Image processing•Feature extraction and analysis
...
The end
Thanks!