Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Surface

9 réponses
Avatar
pdalet
Bonjour,

je suis =E0 la recherche d'un script python qui permette de s=E9lectionner
une partie d'image, en l'occurence une tache afin d'en mesurer la
surface. La partie s=E9lectionn=E9e peut avoir n'importe quelle forme.



L'exp=E9rience de franklin permet de mesurer la longueur d'une mol=E9cule
par le biais d'une surface en connaissant le volume.
Le probl=E8me est que la surface est le plus souvent non circulaire. En
mesurant la surface d'une tache quelconque
sur une photo avec un rep=E8re pour conna=EEtre le nombre de pixels par
cm, on doit pouvoir r=E9ussir cette exp=E9rience =E0 tous les coups quelque-
soit la forme de la tache et faire une mesure plus pr=E9=E7ise.

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

Philippe DALET
philippe.dalet@ac-toulouse.fr

9 réponses

Avatar
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

Avatar
Eric
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
Avatar
pdalet
On 23 juin, 16:55, "Méta-MCI" wrote:
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


Avatar
Laurent Pointal
On 23 juin, 16:55, "Méta-MCI" wrote:
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é]



Avatar
Mihamina Rakotomandimby (R12y)
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

Avatar
Eric
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


Avatar
none
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()
Avatar
none
ps: il doit y avoir plus efficace, mais bon ...


eric

ps2: la solution est plus tordue que ma premiere solution avec la
matrice ...
Avatar
pdalet
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