230 likes | 321 Views
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. Introduction. Contour finding .
E N D
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
Introduction Contour finding • 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:
Processing Five steps: • Pre-processing: erase the noise • Edge detection • Contour detection • Delete the redundant points • Simplify the contours
Pre-processing • Pre-processing: Erasing the noise for 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 noise Another way to erase the noise: Object Labeling Find out all those pixels connected to each other, and label them with the same number. 1 1 1 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 2 2 0 0 1 1 1 0 2 2 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 3 0 1 1 1 0 0 0 3 0 1 1 1 0 0 3 3 0 1 1 1 0 0 0 0 0 [labeled,numObjects] = bwlabel(bw,4)
Pre-processing • Pre-processing: Erasing the noise
Edge detection • Edge detection Fortunately… there is a very useful function in matlab: img_edge=edge(x);
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 detection • How 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
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 index Make sure we know which one will be next neighbor to check! Keep anti-clockwise direction. Contour detection
Contour detection Code: [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
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-pointsleft evomaass=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 % removed end 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;
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!