Grâce à Pseudocode, j'ai pu mettre en pratique ma théorie sur la quantification de la variation spatiale des couleurs afin de faire un distingo entre les images CGI et les véritables photos, telle que définie ci-dessous:
Voici le code correspondant:Nous avons utilisé l'observation que les changements de couleurs se produisent dans une moindre mesure de pixels en pixels dans les CGIs que dans les photographies.
La raison est probablement parce que les photographies contiennent de vrais scènes et objets avec beaucoup de changements de couleurs naturelles, tandis que les CGIs n'ont pas un tel luxe en raison des limitations inhérentes au dessin avec une palette de couleur limitée.
Afin de mesurer la variation spatiale des couleurs, pour chaque pixel des images, nous avons déterminé l'orientation du plan le mieux adapté à un voisinage 5*5 centré sur le pixel concerné. Après normalisation des triplets <R, G, B> vers nR, nG, nB, alors une variation alpha peut être obtenu par:
là où la distance Euclidienne de chaque Pixel dans le voisinage 5*5 du pixel central se résume et est normalisée par le chiffre 25.
J'ai essayé aussi avec un
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 package spatial; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class spatialvariation { public static void main(String[] args)throws Exception { // lecture de l'image BufferedImage image = null; try { image = ImageIO.read(new File("1.bmp")); } catch (IOException e) { e.printStackTrace(); return; } } // retourne un triplet de couleur normé public static double[] getRGB(BufferedImage image, int x, int y) { int argb = image.getRGB(x,y); int a = (argb >>24 ) & 0xFF; int r = (argb >>16 ) & 0xFF; int g = (argb >> 8 ) & 0xFF; int b = argb & 0xFF; double norme = Math.sqrt(r*r + g*g + b*b); return new double[] {r/norme, g/norme, b/norme}; } public static double getAlpha(BufferedImage image, int x, int y) { double alpha=0; // triplet central double[] rgb_0 = getRGB(image,x,y); // pour tout le voisinage 5x5 = [-2,-1,0,1,2]x[-2,-1,0,1,2] for(int dy=-2;dy<=2;dy++) { for(int dx=-2;dx<=2;dx++) { // coordonnées du voisin int y_i = y+dy; int x_i = x+dx; // gestion des bords if (y_i<0) y_i=0; if (y_i>=image.getHeight()) y_i=image.getHeight()-1; if (x_i<0) x_i=0; if (x_i>=image.getWidth()) x_i=image.getWidth()-1; // triplet du voisin double[] rgb_i = getRGB(image,x_i,y_i); // calcul de alpha double delta_r = rgb_i[0]-rgb_0[0]; double delta_g = rgb_i[1]-rgb_0[1]; double delta_b = rgb_i[2]-rgb_0[2]; alpha+=Math.sqrt( delta_r*delta_r + delta_g*delta_g + delta_b*delta_b ); } } return alpha/25; } }
entre public class et public static void main; mais dans les deux cas, je n'ai rien en sortie (sous Eclipse), pas de bug ni de message d'erreur....RIEN.
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part private static BufferedImage image;
J'ai dû faire une erreur dans le code concernant l'output de mon image, mais je débute en Java et je ne vois pas où.....
Quelqu'un peux m'aider??
Merci
Partager