2010-11-20 12 views
6

Supposons que j'ai une image avec, disons, un cercle et un carré. Y a-t-il un moyen de trouver le carré donné à la matrice de l'image? (il n'y a qu'un seul carré, et le temps n'est pas vraiment un problème). Merci.Algorithme pour trouver une forme carrée dans une image?

+1

Est-ce un carré parfait, ou "carré"? –

+1

Rectangle, pour être précis. Mais c'est plutôt vanillé. Supposons qu'il a été dessiné avec l'outil "carré" de MS Paint, puis sauvegardé en tant que gif. –

+1

Le carré est-il aligné sur les axes ou est-il pivoté? – thejh

Répondre

3

Divisons tous les points en "allumé" et "foncé".

Recherchez les points qui sont éclairés et les points au-dessus et au-dessous sont également éclairés. Ceux-ci sont susceptibles d'être une partie d'un avantage. De même: si un point (x, y) est allumé et que les points (x + 1, y), (x + 2, y) sont également allumés, mais (x-1, y) et (y-1 , y) sont sombres, et de manière analogue dans la direction Y, alors vous avez probablement trouvé un coin supérieur gauche. Etc. De cette façon, vous pouvez trouver les coins et ensuite trouver le carré d'eux - semble être une approche simple.

0

Si le carré de l'image est parfait, vérifiez qu'il y a une bordure dans la position attendue. Le pseudo-code dans la réponse de Jh devrait fonctionner correctement.

+0

Merci, Gintautas. Désolé de vous poser cette question, mais pourriez-vous être un peu plus formel? Des maths, ou du pseudo-code peut-être? J'ai du mal à analyser la phrase. Merci. –

+0

Oui, ma première phrase a été cassée, désolé. Fixation. –

+0

J'ai mal compris votre question, je pensais que vous étiez à la recherche d'un rectangle rempli plutôt que juste le calcul, tel que fourni par l'outil "Rectangle" de Paint. Dans ce cas, la solution est beaucoup plus simple. –

3

Quelque chose comme ça?

for (x,y of every black pixel) { 
#those methods should return true if the lines length is more than one pixel 
if (hasLineToRight(x,y)&&hasLineToBottom(x,y)) { 
    otherx=highestXOfLineToRight(); 
    othery=highestYOfLineToBottom(); 
    if (isLine(x,y,x,othery)&&isLine(x,y,otherx,y)) { 
    addBoxToList(x,y,otherx,othery); 
    } 
} 
} 

box image

Vous voulez propably utiliser la boîte avec les plus hautes valeurs de largeur et hauteur.

0

Qu'en est-il de flood filling à partir de points aléatoires jusqu'à ce que vous trouviez votre rectangle?

Questions connexes