Is it possible to detect a specefic form of matrices from a big one?

조회 수: 5 (최근 30일)
mika
mika 2013년 11월 21일
댓글: mika 2014년 4월 21일
Hello, I need to find those 5 forms of matrices from a binary 'big' matrice
X=[1 0 1 ;
0 1 0 ;
1 0 1 ;];
Y=[1 0 1 ;
0 1 0 ;
1 0 0 ;];
O=[0 1 0 ;
1 0 1 ;
0 1 0 ;];
-=[0 0 0 ;
1 1 1 ;
0 0 0 ;];
L=[1 0 0 ;
1 0 0 ;
1 1 1 ;];
Any idea? help is much appreciated
  댓글 수: 3
talha
talha 2013년 11월 21일
how to connect blocks of two different library together ?

댓글을 달려면 로그인하십시오.

채택된 답변

Cedric
Cedric 2013년 11월 21일
편집: Cedric 2013년 11월 22일
EDITED: got rid of a side effect in the dash case (illustrated in the 4th picture below.. I didn't update it though) by using 2*A-1 instead of A and numel(X) instead of nnz(X).
Someone might provide you with a solution based on the Image Processing Toolbox (which I am not familiar with). Here is one potential solution and a hint in the meantime..
1. Based on CONV2
A = double( rand(10) > 0.4 ) ; % Small example.
X = [1 0 1 ; ...
0 1 0 ; ...
1 0 1 ] ;
ker = rot90(rot90( 2*X -1 )) ;
[r, c] = find( conv2(2*A-1, ker, 'same') == numel(X) ) ;
With that and a few runs (need a little luck for RAND to output one or more fillings with matches):
>> A
A =
1 1 1 1 1 1 0 1 0 1
0 0 0 1 1 0 1 1 0 1
1 0 0 0 0 1 0 1 0 1
1 0 1 0 1 0 1 1 1 1
0 1 0 1 0 1 1 1 1 0
0 1 1 0 1 0 0 1 1 0
0 1 1 0 1 1 0 0 0 1
0 1 0 0 1 0 1 1 1 1
0 1 0 1 1 1 1 0 1 1
1 1 0 1 0 1 1 1 0 0
>> [r,c]
ans =
5 4
3 6
which indicates two matches, centered in (5,4) and (3,6). This approach takes ~13ms on my laptop with a 1000x1001 A matrix.
2. By looping over elements of patterns and vectorizing tests on A rather than the opposite.
.. I leave that for later if CONV2 is not suitable.
--------------------------------------------------------------------------------------------------------------------------------
EDIT: here is a more elaborate example..
n = 50 ;
A = double( rand(n, n+1) > 0.5 ) ;
B = 2*A - 1 ;
patterns = {[1 0 1; 0 1 0; 1 0 1]; ... % X
[1 0 1; 0 1 0; 1 0 0]; ... % Y
[0 1 0; 1 0 1; 0 1 0]; ... % O
[0 0 0; 1 1 1; 0 0 0]; ... % -
[1 0 0; 1 0 0; 1 1 1]} ; % L
labels = {'X', 'Y', 'O', '-', 'L'} ;
matches = cell( size(labels )) ;
for pId = 1 : numel( patterns )
nel = numel( patterns{pId} ) ;
ker = 2*patterns{pId} - 1 ;
[r, c] = find( conv2(B, rot90(rot90(ker)), 'same') == nel ) ;
matches{pId} = [r, c] ;
figure(pId) ; clf ; hold on ;
spy(A) ;
plot( c, r, 'r+', 'MarkerSize', 20 ) ;
title( sprintf( 'Matches for "%s" pattern', labels{pId} )) ;
set( gcf, 'Units', 'normalized' ) ;
set( gcf, 'Position', [0 0 0.4 0.7] ) ;
end
which outputs the following figures..
  댓글 수: 6
Cedric
Cedric 2013년 11월 28일
편집: Cedric 2013년 11월 28일
Ok, this is quite different from what the initial question suggested. I would advise you to re-post the question including images of the skeleton and zooms over regions which represent the different patterns. You should also attach the source array or image so people can perform tests.
mika
mika 2014년 1월 13일
Hello,
Can you tell me please how to make the output into the same plot. i'm trying to make the result as one plot but in vain can you help me please.
thank you.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

talha
talha 2013년 11월 21일
how to connect blocks of two different library together ?
  댓글 수: 2
Cedric
Cedric 2013년 11월 21일
Please post a new question and provide more details about your issue.
mika
mika 2014년 4월 21일
okk sorry for late reply
i' m still looking for the solution

댓글을 달려면 로그인하십시오.


Image Analyst
Image Analyst 2013년 11월 26일
Try normalized cross correlation (see attached demo below in blue text), or the hit or miss transform, done by bwhitmiss() in the Image Processing Toolbox.

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by