Matrice de convolution et Plugin Arithmétique.

Discussion de programmation pour éviter d'empiéter dans les autres forums

Modérateurs : Modérateurs, Développeurs

Tom
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 13204
Inscription : 02 févr. 2005 9:35

Matrice de convolution et Plugin Arithmétique.

Message par Tom »

Bonjour,

quelqu'un a-t-il une idée sur la façon d'utiliser une matrice de convolution, (équivalent de Filtre/Divers/Personnalisé)
dans une formule du module Arithmétique de Benjamin Fournier ?
dve
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 34
Inscription : 09 juin 2010 8:08
Version de PhotoFiltre : 10.7.1
Système d'exploitation : XP SP3 / Seven SP1
Processeur : Intel 5 3400
Mémoire RAM : 8 Go
Localisation : CLICHY LA GARENNE

Re: Matrice de convolution et Plugin Arithmétique.

Message par dve »

Bonjour Tom,

j'ai retrouvé ces trois liens traitant des matrices de convolution.

http://docs.gimp.org/fr/plug-in-convmatrix.html
http://patrick.furon.free.fr/_traitemen ... n2D_1.html
http://tavmjong.free.fr/INKSCAPE/MANUAL ... Pixel.html

j'espère seulement que ce ne sont pas des liens
trouvés dans l'une de tes nombreuse interventions !

En espérant que cela t'aidera.



Cordialement.


Dominique.
Tom
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 13204
Inscription : 02 févr. 2005 9:35

Re: Matrice de convolution et Plugin Arithmétique.

Message par Tom »

Ah merci pour ces liens. On y trouve des infos très intéressantes. :)
Il est vrai que je n'ai pas beaucoup cherché des exemples de matrice, dans la mesure ou JCB nous en a proposé une liste
dont le lien se trouve avec la documentation au format chm.

En fait j'aurais voulu intégrer une matrice dans plusieurs traitements de simulation de fusion de calque,
qui fonctionnent dans le module Arithmétique, mais je n'ai aucune idée, ni sur la façon de coder la matrice
dans le langage spécifique de ce plugin, ni sur la façon de la reproduire sur la matrice que constitue l'image.

Mais ce n'est pas grave, je profiterai de tes liens de toutes façons, car j'ai noté quelques idées au passage. :)
dve
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 34
Inscription : 09 juin 2010 8:08
Version de PhotoFiltre : 10.7.1
Système d'exploitation : XP SP3 / Seven SP1
Processeur : Intel 5 3400
Mémoire RAM : 8 Go
Localisation : CLICHY LA GARENNE

Re: Matrice de convolution et Plugin Arithmétique.

Message par dve »

Bonjour Tom,

je crois avoir une piste.

Par comparaison,

première étape : utilisation de : Filtre/Divers/Personalisé.
j'ai utilisé l'exemple plus de contraste avec la matrice suivante sur une image :
0 0 0 0 0
0 0 -1 0 0
0 -1 5 -1 0
0 0 -1 0 0
0 0 0 0 0

dans le module arithmétique j'obtiens exactement la même image en
utilisant les formules suivantes :
T1:scroll(I1,1,0)*(-1);
T2:scroll(I1,-1,0)*(-1);
T3:scroll(I1,0,1)*(-1);
T4:scroll(I1,0,-1)*(-1);
T5:I1*5;
T1+T2+T3+T4+T5 // resultat

Autant de scrolls d'image que de valeurs différentes de 0 autour du point central
avec dans le cas précis la multiplication par -1 pour respecter le signe.
La valeur T5 représente le centre de la matrice.
Résultat dernière ligne.
Ici la valeur du diviseur est de 1.


Même résultat avec l'effet de gravure Roberts

Matrice :
je ne représente que la matrice 3*3
les autres valeurs étant à 0
1 0 0
0 -1 0
0 0 0

Arithmétique :
T1:scroll(I1,1,1); // scroll de la valeur périphérique (1)
T2:I1*(-1); // multiplication de l'image par la valeur centrale
T1+T2 // résultat

j'espère que cela te sera utile.

Tiens nous au courant.

Cordialement.

Dominique
dve
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 34
Inscription : 09 juin 2010 8:08
Version de PhotoFiltre : 10.7.1
Système d'exploitation : XP SP3 / Seven SP1
Processeur : Intel 5 3400
Mémoire RAM : 8 Go
Localisation : CLICHY LA GARENNE

Re: Matrice de convolution et Plugin Arithmétique.

Message par dve »

Rebonjour Tom,

Dans la précipitation, j'ai omis
un élément dans l'exemple Effet de Gravure "Roberts":

je me suis aperçu que j'avais oublié le décalage.


en arithmétique :
T1:scroll(I1,1,1);
T2:I1*(-1);
(T1+T2)+128

La matrice est donnée avec un diviseur de 1 et un décalage de 128.

Cela correspond avec l'exemple des effets de gravure "Roberts"


Cordialement.

Dominique
dve
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 34
Inscription : 09 juin 2010 8:08
Version de PhotoFiltre : 10.7.1
Système d'exploitation : XP SP3 / Seven SP1
Processeur : Intel 5 3400
Mémoire RAM : 8 Go
Localisation : CLICHY LA GARENNE

Re: Matrice de convolution et Plugin Arithmétique.

Message par dve »

Bonjour Tom,

Un autre exemple

Reprenant la détection de contour de JCB
Laplacien de gaussienne ( c'est le titre de l'exemple proposé par JCB)

//Laplacien de gaussienne
// les lignes de la matrice sont traitees de gauche a droite et de haut en bas
//on traite unioquement les cases différentes de zéro
//Ligne 1 de la matrice
T1:scroll(I1,0,-2)*(-1);
//ligne 2 de la matrice
T2:scroll(I1,-1,-1)*(-1);
T3:scroll(I1,0,-1)*(-2);
T4:scroll(I1,1,-1)*(-1);
//ligne centrale de la matrice ligne 3
T5:scroll(I1,-2,0)*(-1);
T6:scroll(I1,-1,0)*(-2);
T7:scroll(I1,1,0)*(-2);
T8:scroll(I1,2,0)*(-1);
//ligne 4 de la matrice
T9:scroll(I1,-1,1)*(-1);
T10:scroll(I1,0,1)*(-2);
T11:scroll(I1,1,1)*(-1);
// ligne 5 de la matrice
T12:scroll(I1,0,2)*(-1);
//valeur centrale de la matrice
T13:I1*(16);
//Diviseur
D:1;
//Decalage
Dec:255;
//Resultat
((T1+T2+T3+T4+T5+T6+T7+T8+T9+T10+T11+T12+T13)/D)+Dec


Tous les essais que j'ai fait en comparaison du document de JCB sont concluants.


Cordialement.

Dominique
Tom
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 13204
Inscription : 02 févr. 2005 9:35

Re: Matrice de convolution et Plugin Arithmétique.

Message par Tom »

Waouh !! :!: eh bé super, je n'aurais jamais imaginé trouver de solution avec la fonction scroll. :D
Bon... j'aime beaucoup les maths, mais je n'ai jamais pratiqué à ce niveau là d'abstraction.
Et pour tout dire, il va falloir que je digère l'info et que je fasse des manips bien concrètes pour essayer de comprendre...
parce qu'à la première lecture j'ai un peu de mal, mais je suis têtu et mon cervolant finira bien par en tirer quelque chose. :)

Donc mille mercis pour cette piste, d'autant que tu l'as testée. Sois certain que je te tiendrai au courant.
dve
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 34
Inscription : 09 juin 2010 8:08
Version de PhotoFiltre : 10.7.1
Système d'exploitation : XP SP3 / Seven SP1
Processeur : Intel 5 3400
Mémoire RAM : 8 Go
Localisation : CLICHY LA GARENNE

Re: Matrice de convolution et Plugin Arithmétique.

Message par dve »

Bonjour Tom,

Un essai pour expliquer la démarche:



Dans la définition de JCB on trouve la remarque suivante:
"Une convolution est une fonction qui modifie chaque pixel par la somme pondérée des pixels voisins."


Ce que j'en ai compris:
on va raisonner sur une matrice 3*3. chaque pixel est numéroté de 1 à 9
1 2 3
4 5 6
7 8 9

chaque pixel à une valeur utilisée dans la matrice
valeurs des pixels (ces valeurs sont là uniquement pour la démonstration)
N° Pixel Valeur
1 : -1
2 : 2
3 : 3
4 : 1
5 : -3
6 : 1
7 : 0
8 : 3
9 : 4

la matrice utilisable se présentera de la manière suivante:
-1 2 3
1 -3 1
0 3 4
Chacune de ces valeurs sera utlisée comme multiplicateur pour chaque image.


Nous allons créer autant d'images que de pixels (soit 9 images)


Chaque image sera référencée T avec un indice de 1 à 9
nous aurons donc

Ligne supérieure de gauche à droite de la matrice
T1:I1*(-1) l'image multipliée par la valeur du pixel
T2:I1*(2)
T3:I1*(3)

ligne centrale élément de gauche
T4:I1*(1)

pixel central
T5:I1*(-3)

ligne centrale élément de droite
T6:I1*(1)

ligne inférieure de gauche à droite de la matrice
T7:I1*(0) on voit que cette valeur peut être ignorée
T8:I1*(3)
T9:I1*(4)

Nous avons créé nos 9 images en ayant utilisé les valeurs de chaque pixel comme multiplicateur.



Nous savons que la valeur définitive du pixel central est dépendante des valeurs des pixels périphériques.

la seule solution est de superposer les pixels périphériques au pixel central pour qu'il soit influencé par ces derniers.

Pour ce faire ilfaut donc décaler les images de manière à les superposer au pixel central
on procède donc au décalage de chaque image périphérique en utilisant la fonction scroll(Image,décalage horizontal, décalage vertical)
ligne supérieure (à noter que dans une matrice 5*5, la ligne supérieure à une coordonnée de -2)
T1:scroll(T1,-1,-1)
T2:scroll(T2,0,-1)
T3:scroll(T3,1,-1)

ligne cenrale élément gauche (à noter que dans une matrice 5*5, la colonne gauche à une coordonnée de -2)

T4:scroll(T4,-1,0)

ligne centrale élément droite (à noter que dans une matrice 5*5, la colonne droite à une coordonnée de 2)
T6:scroll(T6,1,0)

ligne inférieure (à noter que dans une matrice 5*5, la ligne inférieure à une coordonnée de 2)
T7:scroll(T7,-1,1)
T8:scroll(T8,0,1)
T9:scroll(T9,-1,1)

on remarquera que l'image centrale T5 n'est pas concernée par le scroll

il suffit maintenant d'additionner les images pour obtenir le resultat
Tresult:T1+T2+T3+T4+T5+T6+T7+T8+T9

si nécessaire on applique un diviseur et/ou un décalage
le résultat est donc:
((Tresult)/Diviseur)+Décalage


j'espère t'avoir éclairé un peu.


Cordialement.


Dominique


Edité pour correction 06/07/2011 00:30:00
Dernière modification par dve le 06 juil. 2011 0:30, modifié 1 fois.
Tom
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 13204
Inscription : 02 févr. 2005 9:35

Re: Matrice de convolution et Plugin Arithmétique.

Message par Tom »

Merci de tous ces détails qui me font progresser,
je vais m'immerger dans ce processus à ma petite vitesse d'assimilation, et je te tiens au courant.
En tout cas j'ai fais quelques tests avec les formules que tu m'as données et le résultat est vraiment concluant.
Bigrement intéressant cette affaire. :)
Tom
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 13204
Inscription : 02 févr. 2005 9:35

Re: Matrice de convolution et Plugin Arithmétique.

Message par Tom »

Bon ça va il me reste encore deux neurones en état de fonctionner. :)
Je crois avoir compris la notion de scroll et j'ai essayé de l'appliquer à la formule de Renforcement (2) :
-1 -1 -1
-1 9 -1
-1 -1 -1

et j'obtiens : EDIT 06/07/2011 16:23 modif du sens de décalage même si la matrice est symétrique
//Renforcement (2)
//ligne 2 de la matrice
T1:scroll(I1,1,1)*(-1);
T2:scroll(I1,0,1)*(-1);
T3:scroll(I1,-1,1)*(-1);
//ligne centrale de la matrice ligne 3
T4:scroll(I1,1,0)*(-1);
T5:scroll(I1,-1,0)*(-1);
//ligne 4 de la matrice
T6:scroll(I1,1,-1)*(-1);
T7:scroll(I1,0,-1)*(-1);
T8:scroll(I1,-1,-1)*(-1);
//valeur centrale de la matrice
T9:I1*(9);
//Diviseur
D:1;
//Decalage
Dec:0;
//Resultat
((T1+T2+T3+T4+T5+T6+T7+T8+T9)/D)+Dec

ce qui me donne bien le rendu de la planche de Jean-Claude Bulot.

Un grand merci à toi Dominique, et encore un grand merci à Jean-Claude dont les travaux nous aident bien encore dans cette affaire. :clap: :clap: :clap:
dve
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 34
Inscription : 09 juin 2010 8:08
Version de PhotoFiltre : 10.7.1
Système d'exploitation : XP SP3 / Seven SP1
Processeur : Intel 5 3400
Mémoire RAM : 8 Go
Localisation : CLICHY LA GARENNE

Re: Matrice de convolution et Plugin Arithmétique.

Message par dve »

Bonjour Tom;

Eh bien, content d'avoir pu t'aider.
En général c'est toi qui nous aide !
Juste retour !!!



Un petit correctif par rapport aux coordonnées utilisées dans la fonction scroll :

Si l'on considère que l'élément central de la matrice (élément de référence)
a pour coordonnées x=0 et y=0
les coordonnées des autres pixel sont déduites à partir des coordonnées de ce point 0.
soit:
-y
-x 0 +x
+y

Ce qui donne la matrice de coordonnées suivantes pour une matrice 5*5.
Les coordonnées de chaque point étant représentées par
valeur de x,valeur de y

Code : Tout sélectionner

	A	B	C	D	E
1	-2,-2	-1,-2	0,-2	1,-2	2,-2
2	-2,-1	-1,-1	0,-1	1,-1	2,-1
3	-2,0	-1,0	0,0	1,0	2,0
4	-2,1	-1,1	0,1	1,1	2,1
5	-2,2	-1,2	0,2	1,2	2,2
On voit que pour superposer le pixel de la colonne A ligne 1
au pixel de coordonnées 0,0 colonne C ligne 3,
il faut décaler de +2 en horizontal (x)
et +2 en vertical (y).
Soit la formule : scroll(I1,2,2)

De même pour le pixel situé en B4,
il faut décaler de +1 en horizontal (x)
et -1 en vertical (y).
Soit la formule : scroll(I1,1,-1)

En fait j'avais directement utilisé les valeurs des coordonnées
dans les formules de scroll que je t'avais communiqué
ce qui inversait complètement les scrolls


A partir de la matrice précédente, on peut déduire les valeurs à utiliser dans les formules
de scroll en fonction des positions des pixels.
à savoir :

Code : Tout sélectionner

	A	B	C	D	E
1	2,2	1,2	0,2	-1,2	-2,2
2	2,1	1,1	0,1	-1,1	-2,1
3	2,0	1,0	0,0	-1,0	-2,0
4	2,-1	1,-1	0,-1	-1,-1	-2,-1
5	2,-2	1,-2	0,-2	-1,-2	-2,-2
si l'on superpose les deux matrices
et que l'on aditionne les valeurs
cellule par cellule,
on s'apercoit que les résultat de chaque cellule est 0,0si ce n'est pas le cas c'est que j'ai fait une erreur de valeur quelque part.



Avantages et inconvénients de l'utilisation du module arithmétique :
AVANTAGES
- avoir une matrice qui n'est pas limitée à 5*5.
on peut penser à des matrices 7*7, 9*9 ...
A voir après si c'est utile.
- Le point de référence 0,0 n'est pas obligatoirement central.
- on peut envisager des matrices totalement assymétriques :

Code : Tout sélectionner

	A	B	C	D	
1	2,2	1,2	0,2	-1,2	
2	2,1	1,1	0,1	-1,1	
3	2,0	1,0	0,0	-1,0	
A voir également si c'est utile

INCONVENIENTS
L'inconvénient que j'ai identifié est que le système risque
d'être gourmand en ressources.
En effet, on construit autant d'images intermédiaires que de pixels
dont la valeur est différente de 0.
Alors que je suppose que le filtre personalisé utilise
d'autres techniques permettant d'optimiser
la sollicitation des ressources.


Voila.
Nous avons par ce biais tranféré le fonctionnement du filtre personalisé
au module arithmétique.


Toutefois, pour ma part, j'aimerais comprendre
pourquoi telle ou telle matrice donne tel résultat (beaucoup de tels la dedans !)
Appliquer les matrices de JCB est une chose,
mais pourquoi les valeurs positionnées
comme dans les exemples donnent ces résultats ?

Si tu as la réponse je suis preneur.
Sinon JCB peut peut-être nous éclairer.



Cordialement.


Dominique
Tom
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 13204
Inscription : 02 févr. 2005 9:35

Re: Matrice de convolution et Plugin Arithmétique.

Message par Tom »

Ah... ??? alors donc si j'ai bien compris, pour être orthodoxe, (surtout quand la matrice n'est pas symétrique)
il faut utiliser la deuxième matrice de décalage pour paramétrer le scroll ?

Je n'ai pas tout assimilé, donc pourquoi pas, mais il ne semble pas que ce soit la logique décrite par l'auteur du plugin Arithmétique :

Code : Tout sélectionner

Scroll(x, dx, dy): Permet de décaler l'image d'un certains nombre de pixels... Ce qui disparait d'un coté réapparait de l'autre
                   dx indique le décalage horizontal (négatif = à gauche, positif = à droite)
                   dy indique le décalage vertical (négatif = en haut, positif = en bas)
                   A noter que le décalage n'est pas obligatoirement le même pour tous les points ou les composantes de l'images.
Pour les autres questions concernant les effets de tel ou tel paramètres, ça dépasse largement mes connaissances actuelles.
Bon je te laisse j'ai plusieurs trucs à régler. A+
Tom
Administrateur(trice)|Administrateur|Administratrice
Administrateur(trice)|Administrateur|Administratrice
Messages : 13204
Inscription : 02 févr. 2005 9:35

Re: Matrice de convolution et Plugin Arithmétique.

Message par Tom »

Oui OK, bien vu, je retire ma remarque, tu as raison : => il faut appliquer la deuxième matrice de décalage pour paramétrer le scroll

Il suffit de faire l'essai avec une matrice non symétrique comme celle de la Gravure Roberts pour s'apercevoir du sens à donner
au décalage, sinon on inverse les pleins et les creux de la gravure.
Donc je vais modifier ma matrice de renforcement pour n'induire personne en erreur.
Merci de cette rectification.
dve
Nouveau(elle)|Nouveau|Nouvelle
Nouveau(elle)|Nouveau|Nouvelle
Messages : 34
Inscription : 09 juin 2010 8:08
Version de PhotoFiltre : 10.7.1
Système d'exploitation : XP SP3 / Seven SP1
Processeur : Intel 5 3400
Mémoire RAM : 8 Go
Localisation : CLICHY LA GARENNE

Re: Matrice de convolution et Plugin Arithmétique.

Message par dve »

C'est vrai que ce n'était pas facile à expliquer !

J'attends les résultats avec impatience.

Cordialement.

Dominique
JCB
Modérateur(trice)|Modérateur|Modératrice
Modérateur(trice)|Modérateur|Modératrice
Messages : 2898
Inscription : 10 févr. 2004 19:36
Version de PhotoFiltre : PF v11.4.2(x64)- PFS v10.14.1
Système d'exploitation : Windows 10 Home 64bits
Processeur : Intel inside Pentium
Mémoire RAM : 4 GB
Localisation : LILLE

Re: Matrice de convolution et Plugin Arithmétique.

Message par JCB »

Bonsoir, :)
dve a écrit :Si tu as la réponse je suis preneur.
Sinon JCB peut peut-être nous éclairer.
J'ai seulement fait le tour de pas mal de sites qui parlent des circonvolutions dans le domaine de la photographie.
Mais le niveau de mathématique, utilisé dans les descriptions, est un peu haut pour moi. :cry:

J'ai seulement recensé les matrices qui pouvaient être intéressantes dans PFS. :wink: