Se connecter avec
S'enregistrer | Connectez-vous

Colorier une image - Algo

Dernière réponse : dans Programmation

Bonjour à tous,

Me revoilà, pour une autre question :) 

Je suis sur ce problème :
Une image (1000*800)
Des valeurs quadrillé dessus (tous les 36 pixels en largeur et les 26 pixels en hauteur)
Chaque valeurs à une couleur associé

Il me reste à trouver un bon algo pour colorier correctement toute l'image avec ces valeurs. Comment feriez-vous ?
J'ai essayé beaucoup de méthode déjà, mais aucun n'est vraiment parfaite ...

Découpé en carré, puis en sous carré, avec des moyennes pondérés pour faire des dégradés :

v1.................................. v2


(sous carré ...)



v3.................................. v4

Chaque pixel a comme valeur la moyenne pondéré (selon sa distance) des 4 valeurs autour. Mais on voit trop les bords des carrés ...
J'ai essayer avec une triangulation (delaunay), mais c'est idem, on voit trop les jonctions des triangles.

Le mieux serait surement de colorier selon un cercle, en prenant les x valeurs autour :

Le tout est de colorier les pixels entre chaque valeur, et de façon parfaite, sans coupure de couleur, tout en dégradé, aussi bien haut, droit, gauche, bas ... Et c'est pas tout simple à vrai dire ! :( 

Merci pour votre aide ;) 

Guich

Autres pages sur : colorier image algo

Lassé par la pub ? Créez un compte
Expert Programmation

Salut Guich :hello: 

En voilà un problème intéressant !

Ce que tu fais s'appelle un filtre graphique. Il s'agit en général de l'application d'une matrice, caractérisée par ses dimensions et par chacun de ces coefficients.

Il n'y a pas de matrice idéale. Teste différentes dimensions (quoique je pense que 36x26 soit une bonne idée), et différents coeffs.

Tu peux commencer par remplir tes rectangles de 36 par 26 avec la valeur nominale. Puis tu passes un filtre adoucisseur, plus ou moins fort, et/ou plus ou moins de fois.

Coucou Zeb !

Les mots magiques pour réaliser ça sont : Bilinear, Bicubic, Trilinear ... Interpolation
Il serait complexe de les décrire ici, je vous laisse aller regarder sur wikipedia.

Mais en gros, on prend 4 points, on interpole les valeurs en fonction de leurs distances au point à colorier, puis on fait la moyenne des 4. Et on obtient donc la couleur souhaité. Sauf qu'il faut faire attention, car tout ça est inversé. En effet, plus la distance est grande, moins la couleur du point aura de poids sur le pixel à colorier. Et si on se trouve sur un bord, le poids des 2 points les plus éloignés est nul !





Ceci dis, il y a plusieurs manières de faire ... Cette technique est utilisée dans le redimensionnement d'image, et c'est de loin la meilleur (bilinear interpolation). Le débat est ouvert pour tous ceux qui souhaitent ajouter des choses, des avis, des questions ...

Je peux vous donner mon algo en pseudo code si sa intéresse qqun ...

:hello: 

zeb a dit :
Yepeeee!

filtre, transformation, produit de convolution, fourrier, toussa :o 
:D 

En fait, tu veux qu'on te règle tes paramètres ou qu'on te propose d'autres fonctions ?


Me revoilà Zeb, j'avais souvenir que tu parlais de convultion, et j'ai vu que dans la méthode bicubic c'était utilisé .... Alors je te demande ;)  J'ai bcp de mal à tout comprendre pour dire vrai.

http://en.wikipedia.org/wiki/Bicubic_interpolation

J'ai un peu peur pour les temps de calculs :'(  Et j'aimerai que la fonction qui réalise ça soit courte ... que ce soit pas un marteau pilon !
Je vais continuer de regarder tout ça.

Merci.

Edit :

  1. function bicubicFilter(value)
  2.  
  3.  
  4.  
  5. if (value < 0.0)
  6.  
  7. value = -value;
  8.  
  9. end;
  10.  
  11.  
  12.  
  13. if (Value < 1.0)
  14.  
  15. tt = sqr(value);
  16.  
  17. result = 0.5*tt*value - tt + 2.0 / 3.0;
  18.  
  19. elseif (value < 2.0)
  20.  
  21. value = 2.0 - value;
  22.  
  23. result = 1.0/6.0 * sqr(value) * value;
  24.  
  25. else
  26.  
  27. result = 0.0;
  28.  
  29. end;
  30.  
  31.  
  32.  
  33. endfunction;


Voilà une méthode que j'ai trouvé sur le net. Mais je trouve ça très simple pour faire une interpolation bicubique ... :(  Et j'ai du mal à savoir d'où sortent les valeurs (2.0, 6.0 ...) Surtout, que j'ai toujours mes 4 points de valeurs, e que je dois colorier à l'intérieur. Or là, la mtéhode prendre une unique valeur ...
Expert Programmation

Eh, eh. Cékiki regrette maintenant les cours de maths où il n'écoutait pas ? :o 
http://fr.wikipedia.org/wiki/Produit_de_convolution

Le but du jeu est de transformer de savants calculs très compliqués en opérations simples par transformée de Fourrier (tu as déjà dû croiser ce type dans tes études, au chapitre réseau ou traitement du signal, n'est-ce pas ?). Alors abandonne l'idée de tout comprendre, et laisse ses considérations aux mathématiciens.

Par contre, tu peux appliquer un truc tout fait. Ce que tu nous proposes me paraît bizarre. Tu devrais avoir un calcul matriciel, plutôt.

Non je n'ai jamais vu ça Zeb ... on ne fait pas de traitement de signal dans ma section :)  Et même en math, jamais vu ... et vouii :) 

J'ai déjà regardé ton lien ... :(  (é rien compris !)

Je rappelle la situation, j'ai un carré, où chaque angle a une valeur, et je dois colorier l'intérieur. Bien sûr, je n'ai pas un seul carré, mais une multitude de carré (grille).

v1-------v2
|
|
v3-------v4

J'aimerai bien qu'on dégrossisse ensemble le problème, et qu'on crée ensemble l'aglo Zeb ;)  (ou d'autre :) )

Voici une base :
  1. /**
  2. * Interpolation par Spline Cubique
  3. *
  4. * @author Xavier Philippeau
  5. *
  6. */
  7. public class Interpolate {
  8.  
  9. // spline factor in the range [-1,0]
  10. private double a = -0.5;
  11.  
  12. // original image
  13. private Channel channel = null;
  14.  
  15. public Interpolate(Channel c) {
  16. this.channel = c;
  17. }
  18.  
  19. // --- Spline coefficients ----------------------------------------------------
  20.  
  21. // C0(t) = -at3 + at2
  22. private double C0(double t) {
  23. return -a*t*t*t + a*t*t;
  24. }
  25.  
  26. // C1(t) = -(a+2)t3 + (2a+3)t2 - at
  27. private double C1(double t) {
  28. return -(a+2)*t*t*t + (2*a+3)*t*t - a*t;
  29. }
  30.  
  31. // C2(t) = (a+2)t3 - (a+3)t2 + 1
  32. private double C2(double t) {
  33. return (a+2)*t*t*t - (a+3)*t*t + 1;
  34. }
  35.  
  36. // C3(t) = at3 - 2at2 + at
  37. private double C3(double t) {
  38. return a*t*t*t - 2*a*t*t + a*t;
  39. }
  40.  
  41. // --- Continous interpolation from discrete values ---------------------------
  42.  
  43. // discret value for pixel of coordinates: i (integer) , j (integer)
  44. private double f(int i, int j) {
  45. return this.channel.getValue(i, j);
  46. }
  47.  
  48. // compute interpolated value for pixel of coordinates: x (real) , j (integer)
  49. private double H(int j, double x) {
  50. int i = (int)x;
  51. return f(i-1,j)*C3(x-i) + f(i,j)*C2(x-i) + f(i+1,j)* C1(x-i) + f(i+2,j)*C0(x-i);
  52. }
  53.  
  54. // compute interpolated value for pixel of coordinates: x (real) , y (real)
  55. public double value(double x, double y) {
  56. int j = (int)y;
  57. return H(j-1,x)*C3(y-j) + H(j,x)*C2(y-j) + H(j+1,x)*C1(y-j) + H(j+2,x)*C0(y-j);
  58. }
  59. }


Avec les matrices :
  1. Fonctions de base:
  2.  
  3. C3(t) = at3 - 2at2 + at
  4. C2(t) = (a+2)t3 - (a+3)t2 + 1
  5. C1(t) = -(a+2)t3 + (2a+3)t2 - at
  6. C0(t) = -at3 + at2
  7.  
  8.  
  9. Forme matricielle
  10.  
  11. | a , a+2 , -(a+2) , -a | | P(i-1) |
  12. |t3 t2 t 1| x | -2a , -(a+3) , 2a+3 , a | x | P(i) |
  13. | a , 0 , -a , 0 | | P(i+1) |
  14. | 0 , 1 , 0 , 0 | | P(i+2) |


Le truc, c'est que j'ai beau essayer de comprendre, je n'y arrive pas :(  et encore moins à l'appliquer à mon problème
Expert Programmation

Eh ! c'est des maths.

C3(t) = at3 - 2at2 + at

C'est un polygone. t3 signifie t puissance 3.
Ou en C :
  1. a*t*t*t - 2*a*t*t + a*t;

C'est le produit matricielle entre la ligne [t3, t2, t1, 1] et la première colonne de la matrice [a, -2a, a, 0] (<-- en ligne, mais c'est une colonne).

zeb a dit :
Ce que tu fais s'appelle un filtre graphique. Il s'agit en général de l'application d'une matrice, caractérisée par ses dimensions et par chacun de ces coefficients.
Je savais bien que tu allais te prendre la tête avec une matrice et ces coeffs ! Ton interpolation est cubique, parce qu'une te faut 4 points de référence. Tiens, 4x4, c'est justement la taille de ta matrice.

Bon, je vais regarder d'un peu plus près. Qu'en dit M. Xavier Philippeau ?

En attendant, un petit cours : http://fr.wikipedia.org/wiki/Interpolation_num%C3%A9riq...

J'avance un peu :) 
Je re-formule mon énoncé :

  1. (0,800)
  2. |
  3. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v]
  4. |
  5. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v]
  6. |
  7. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v]
  8. |
  9. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v]
  10. |
  11. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v]
  12. |
  13. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v]
  14. |
  15. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v]
  16. | ___________________
  17. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] | [x,y,v] [x,y,v] |
  18. | | | <------- (Zoom sur ce carré)
  19. | [x,y,v] [x,y,v] [x,y,v] [x,y,v] [x,y,v] | [x,y,v] [x,y,v] |
  20. ___________________
  21. (0,0) _____________________________________________________________ (700,0)


  1. [x,y, v] [x,y,v]
  2. ^
  3. |______________________________ V = valeur du pixel, soit : Color(r,g,b)
  4.  
  5. o <------------------------------- Pixel à calculer
  6.  
  7.  
  8. [x,y,v] [x,y,v]


Je prend donc la valeur (Color) des 4 angles, et j'applique la matrice ... c'est ça ?
Donc :
  1. # C3(t) = at3 - 2at2 + at
  2. # C2(t) = (a+2)t3 - (a+3)t2 + 1
  3. # C1(t) = -(a+2)t3 + (2a+3)t2 - at
  4. # C0(t) = -at3 + at2

t = x,y ?
a = ? :( 
Et quand j'ai calculer C0...3, celà me donne quoi ? La valeur (Color) du pixel o ? Mais où est-ce que les valeurs des 4 points autour entrent-ils en compte ? :pt1cable: 

Je reprend la méthode cubique (wikipedia)
  1. double interpolationCubique(double y0,double y1,double y2,double y3,double mu)
  2. {
  3. double a0,a1,a2,a3,mu2;
  4.  
  5. mu2 = mu*mu;
  6. a0 = y3 - y2 - y0 + y1;
  7. a1 = y0 - y1 - a0;
  8. a2 = y2 - y0;
  9. a3 = y1;
  10.  
  11. return (a0*mu*mu2+a1*mu2+a2*mu+a3);
  12. }

Quelle est la différence entre la "bi"cubique ?
Il y a ici 4y, qui doivent correspondre surement à mes 4 valeurs de couleur non ? Si c'est le cas, où gère t'on les coordonnées ? Car la couleur dépend aussi des coordonnées du pixel pour pouvoir l'interpoler (plus il est loin de telle ou telle valeur, moins cette valeur aura d'impact sur le pixel en question et vice versa ...)

C'est un grand cafouillage :(  je sais pas si c'est moi, ou si c'est dure à comprendre, mais j'ai du mal, pfouaa
Je vais me replonger dedans,
En tout cas merci pour vos réponses, et futures réponses ;) 

Me revoilà. J'ai cherché, en vain ... J'ai utilisé la méthode bilinéaire (selon les 4 points autours), puis une matrice (gauss) de convultion pour casser les formes carrés. Mais le résultat n'est pas satisfaisant :( 

Je reformule le problème, si défois qqun tombe dessus et arrive à trouver une réponse ;) 

[a] [?] [?] [?] [?] [?] [b] [?] [?] [?] [?] [?] [c] [?] [?] [?] [?] [?] [d] [?] [?] [?] [?] [?] [e]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[f ] [?] [?] [?] [?] [?] [g] [?] [?] [?] [?] [?] [h] [?] [?] [?] [?] [?] [i ] [?] [?] [?] [?] [?] [j ]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[k] [?] [?] [?] [?] [?] [l] [?] [?] [?] [?] [?] [m] [?] [?] [?] [?] [?] [n] [?] [?] [?] [?] [?] [o]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [z] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[p] [?] [?] [?] [?] [?] [q] [?] [?] [?] [?] [?] [r ] [?] [?] [?] [?] [?] [s] [?] [?] [?] [?] [?] [t ]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?] [?]
[u] [?] [?] [?] [?] [?] [v] [?] [?] [?] [?] [?] [w] [?] [?] [?] [?] [?] [x] [?] [?] [?] [?] [?] [y]

Tout les points [a.....y] sont connus et fixes. Il me faut calculer les points intermédiaires (comme le [z]).
Color z = ??????


Merci beaucoup pour vos réponses.
Guich
Lassé par la pub ? Créez un compte