Surface

Le
pdalet
Bonjour,

je suis à la recherche d'un script python qui permette de sélectionner
une partie d'image, en l'occurence une tache afin d'en mesurer la
surface. La partie sélectionnée peut avoir n'importe quelle forme.



L'expérience de franklin permet de mesurer la longueur d'une molécule
par le biais d'une surface en connaissant le volume.
Le problème est que la surface est le plus souvent non circulaire. En
mesurant la surface d'une tache quelconque
sur une photo avec un repère pour connaître le nombre de pixels par
cm, on doit pouvoir réussir cette expérience à tous les coups quelque-
soit la forme de la tache et faire une mesure plus préçise.

http://www.web-sciences.com/tp2nde/tp0/tp0.php

Philippe DALET
philippe.dalet@ac-toulouse.fr
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Méta-MCI
Le #627100
Salut !


L'expérience de franklin permet de mesurer la longueur d'une
molécule par le biais d'une surface en connaissant le volume.


C'est jouable, mais seulement en supposant que :
- l'épaisseur est uniforme sur toute la tache (donc, en oubliant la
capillarité, et les effets de bord)
- toutes les molécules soient identiques
- toutes les molécules soient rangées verticalement, selon un arrangement
quasi-cristallin (douteux, pour un liquide)
- on néglige l'espace inter-moléculaire (ou alors, on considère qu'il fait
partie de la molécule)


Pour en revenir à ta question, si la tâche est convexe, il est courant de la
décomposer en une multitude de rectangle, dont il suffira d'additionner les
surfaces.
Si la tâche est concave, il faut faire de même, après avoir décomposé la
tâche en plusieurs sous-tâches convexes.


En ces périodes de fin d'annéee scolaire, ça me rappelle mes cours de 4e.
Nostalgie...


@+

Michel Claveau

Eric
Le #627099
Bonjour,

pourquoi ne pas balayer la tache horizontalement, et de haut en bas,
en comptant simplement le nombre de pixels qui vont bien.

on peut copier créer une matrice rectangulaire initialisée à zero de
meme dimension que la tache, puis mettre a 1 les bordures de la taches.

Il suffit de balayer la matrice, des qu'on rencontre un 1, c'est qu'on
rentre dans la tache, on commence à compter les pixels, puis des qu'on
rencontre de nouveaux un 1, c'est qu'on est sorti de la tache. On passe
a la ligne suivante, et ainsi de suite.

il faut aussi de gerer le cas ou plusieurs 1 se suivent ...

0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0
0 0 0 0 1 0 1 1 0 0 0
0 0 1 1 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 0 1 0 0
0 1 0 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 1 0 0 0
0 0 0 1 1 0 1 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0


Non?

Eric
pdalet
Le #626820
On 23 juin, 16:55, "Méta-MCI"
Salut !

L'expérience de franklin permet de mesurer la longueur d'une
molécule par le biais d'une surface en connaissant le volume.


C'est jouable, mais seulement en supposant que :
- l'épaisseur est uniforme sur toute la tache (donc, en oubliant la
capillarité, et les effets de bord)
- toutes les molécules soient identiques
- toutes les molécules soient rangées verticalement, selon un arran gement
quasi-cristallin (douteux, pour un liquide)
- on néglige l'espace inter-moléculaire (ou alors, on considère q u'il fait
partie de la molécule)

Pour en revenir à ta question, si la tâche est convexe, il est couran t de la
décomposer en une multitude de rectangle, dont il suffira d'additionner les
surfaces.
Si la tâche est concave, il faut faire de même, après avoir décom posé la
tâche en plusieurs sous-tâches convexes.

En ces périodes de fin d'annéee scolaire, ça me rappelle mes cours de 4e.
Nostalgie...

@+

Michel Claveau


La surface est plane: la molécule possède une partie hydrophobe et une
partie hydrophile , donc elle se dispose sur l'eau la tête hydrophile
vers le bas et la tête hydrphobe vers l'air.

Le principe à retenir est de dessiner sur le graphique une série de
segments qui vont entourer la zone où se trouve la tache (molécule)
et fermer cette série. Une fois ceci réalisé, il suffit de mesurer la
surface en pixel/cm2 par exemple.

Existe-t-il un objet image possédant une méthode qui permette de
découper cette zone et d'en tirer l'information surface. Je n'ai rien
vu sur PIL.

Philippe DALET


Laurent Pointal
Le #626566
On 23 juin, 16:55, "Méta-MCI"
Salut !

L'expérience de franklin permet de mesurer la longueur d'une
molécule par le biais d'une surface en connaissant le volume.
C'est jouable, mais seulement en supposant que :

- l'épaisseur est uniforme sur toute la tache (donc, en oubliant la
capillarité, et les effets de bord)
- toutes les molécules soient identiques
- toutes les molécules soient rangées verticalement, selon un arrangement
quasi-cristallin (douteux, pour un liquide)
- on néglige l'espace inter-moléculaire (ou alors, on considère qu'il fait
partie de la molécule)

Pour en revenir à ta question, si la tâche est convexe, il est courant de la
décomposer en une multitude de rectangle, dont il suffira d'additionner les
surfaces.
Si la tâche est concave, il faut faire de même, après avoir décomposé la
tâche en plusieurs sous-tâches convexes.

En ces périodes de fin d'annéee scolaire, ça me rappelle mes cours de 4e.
Nostalgie...

@+

Michel Claveau


La surface est plane: la molécule possède une partie hydrophobe et une
partie hydrophile , donc elle se dispose sur l'eau la tête hydrophile
vers le bas et la tête hydrphobe vers l'air.

Le principe à retenir est de dessiner sur le graphique une série de
segments qui vont entourer la zone où se trouve la tache (molécule)
et fermer cette série. Une fois ceci réalisé, il suffit de mesurer la
surface en pixel/cm2 par exemple.

Existe-t-il un objet image possédant une méthode qui permette de
découper cette zone et d'en tirer l'information surface. Je n'ai rien
vu sur PIL.


Peut-être par là:
http://filters.sourceforge.net/
http://filters.sourceforge.net/wikifilters/index.php/Tutorial_Python

[note: jamais testé, juste bookmarqué]



Mihamina Rakotomandimby (R12y)
Le #626565
Eric wrote:

Bonjour,


Bonjour,

on peut copier créer une matrice rectangulaire initialisée à zero de
meme dimension que la tache, puis mettre a 1 les bordures de la taches.


Je pense qu'on s'en sortirai mieux en mettant à 1 ce qui est _dans_ la tache
(bordure comprise).
Ainsi en comptant le nombre de 1 on a le nombre de pixel, et la surface.
Ceci dit, je pense que tout le monde ici aurait pensé à un truc aussi
simple. Donc ça ne résoud pas le problème.

En quoi l'algo que je viens de proposer ne résoud pas le problème?

--
"Beaucoup de gens achètent des choses dont ils n'ont pas besoin
avec de l'argent qu'il n'ont pas (crédits & emprunts)
pour impressionner des gens qu'ils n'aiment pas."
Inconnu

Eric
Le #626564
Eric wrote:

Bonjour,


Bonjour,

on peut copier créer une matrice rectangulaire initialisée à zero de
meme dimension que la tache, puis mettre a 1 les bordures de la taches.


Je pense qu'on s'en sortirai mieux en mettant à 1 ce qui est _dans_ la tache
(bordure comprise).
Ainsi en comptant le nombre de 1 on a le nombre de pixel, et la surface.
Ceci dit, je pense que tout le monde ici aurait pensé à un truc aussi
simple. Donc ça ne résoud pas le problème.

En quoi l'algo que je viens de proposer ne résoud pas le problème?




peut être parce qu'en mettant a 1 l'interieur de la tache, tu fais tout
le boulot. Le plus simple a mon avis est d'imiter les algo de
remplissage de formes que l'on trouve dans les logiciels de retouche
bitmap...

Eric


none
Le #626563
Rebonjour, je me suis penché sur ton problème,
voila un petit truc en python qui calcule la surface d'une tache sur une
image en noir et blanc, delimitée par un contour blanc ( ou l'inverse )
et sur fond noir.

A toi d'adapter cela a ta maniere ..

#!/usr/bin/python

import Image

def decoupeImage (image):
ancienPixel = image.getpixel((0,0))
tab=[]

for x in range(0,image.size[0]) :
tableau = [0 ]
for y in range (0,image.size[1]) :
pixel = image.getpixel((x,y))
if pixel!=ancienPixel :
tableau.append(0)
tableau[-1] = tableau[-1] + 1
ancienPixel = pixel
tab.append(tableau)

return tab

def calculeSurface (tab):
somme = 0
for ligne in tab :
nbSections = len(ligne)
if nbSections == 1:
continue
if nbSections == 3:
somme += ligne[1]
continue
if nbSections == 5:
somme += ligne[1] + ligne[2] + ligne[3]
return somme


def main():

fname = "tache.tga"
im = Image.open(fname)
print "Taille de l'image:",im.size

tab = decoupeImage(im)

print "Surface en nombre de pixels:",calculeSurface(tab)

###################

main()
none
Le #626562
ps: il doit y avoir plus efficace, mais bon ...


eric

ps2: la solution est plus tordue que ma premiere solution avec la
matrice ...
pdalet
Le #626557
On 25 juin, 19:46, none <""eric"@(none)"> wrote:
ps: il doit y avoir plus efficace, mais bon ...

eric

ps2: la solution est plus tordue que ma premiere solution avec la
matrice ...


Merci pour tous ces renseignements.
Le module http://filters.sourceforge.net/ et PIL doivent me permettre
de résoudre ce problème.
Filters doit me permettre d'automatiser la recherche de la surface sur
une image et PIL le calcul de cette surface.
Ph DALET

Publicité
Poster une réponse
Anonyme