electronika

Détection de contours dans une image en php

 Voici ici quelques exemples de détection de bord en php, la première matrice appliqué par convolution amplifie les pointes tandis que le second atténue les pointes.Attention, le scripte suivant écrit dans un fichier image existant vous devez donc autoriser l’écriture sur celui-ci. (chmode 777)

Attention, l’indentation du code à été perdu grâce au magnifique navigateur chrome de google, je l’ai remis en place (retour à la linge) mais reste toujours difficile à lire.

dsc_0112x8.png

source image: http://tavmjong.free.fr/INKSCAPE/MANUAL/html_fr/Filters-Pixel.html

Filtre appliqué:

-1  -1  -1

-1   7  -1

-1  -1  -1

Diviseur de 9

Résultat:

out.jpg

Code php:

<?php

function filtre($file,$file_out){

if (file_exists($file)){$image = imagecreatefrompng($file);

$x_dimension = imagesx($image);

$y_dimension = imagesy($image);

$new_image = imagecreatetruecolor($x_dimension, $y_dimension);//

for ($x = 0; $x < $x_dimension; $x++) {

for ($y = 0; $y < $y_dimension; $y++) {

$lum=(  7 * pix_luminence($x,$y,$image)

- pix_luminence($x+1,$y,$image)

- pix_luminence($x-1,$y,$image)

- pix_luminence($x,$y+1,$image)

- pix_luminence($x,$y-1,$image)

- pix_luminence($x+1,$y+1,$image)

- pix_luminence($x+1,$y-1,$image)

- pix_luminence($x-1,$y+1,$image)

- pix_luminence($x-1,$y-1,$image)/9);

$color = imagecolorallocate($new_image,$lum,$lum,$lum);

imagesetpixel($new_image, $x, $y, $color);}}

imagejpeg($new_image, $file_out);

return true;

}else{

return false;

}

}

function pix_luminence($x,$y,$image){

$luminance_running_sum=0;

$rgb = imagecolorat($image, $x, $y);

$r = ($rgb >> 16) & 0xFF;

$g = ($rgb >> 8) & 0xFF;

$b = $rgb & 0xFF;

$luminance_running_sum = (0.30 * $r) + (0.59 * $g) + (0.11 * $b);

return $luminance_running_sum;

}

echo”<img src=’dsc_0112×8.png’>”;//fichier source

if (filtre(”dsc_0112×8.png”,”out.jpg”)){

echo” <img src=’out.jpg’>”;

}else{

echo”erreur fichier source inexistant”;

}

?>

 Autre filtre de détection de bord:

0    1    0

1   -4    1

0    1    0

diviseur 5 (les opérations sur les 0 ne sont pas faites)

out2.jpg

<?php

function filtre($file,$file_out){

   if (file_exists($file)){

      $image = imagecreatefrompng($file);

$x_dimension = imagesx($image);

$y_dimension = imagesy($image);

$new_image = imagecreatetruecolor($x_dimension, $y_dimension);

//for ($x = 0; $x < $x_dimension; $x++) {

for ($y = 0; $y < $y_dimension; $y++) {

$lum=(-4 * pix_luminence($x,$y,$image)

+ pix_luminence($x+1,$y,$image)

+ pix_luminence($x-1,$y,$image)

+ pix_luminence($x,$y+1,$image)

+ pix_luminence($x,$y-1,$image)/5);

$color = imagecolorallocate($new_image,$lum,$lum,$lum);

imagesetpixel($new_image, $x, $y, $color);

}}

imagejpeg($new_image, $file_out);

return true;

}else{

return false;

}}

function pix_luminence($x,$y,$image){

     $luminance_running_sum=0;

     $rgb = imagecolorat($image, $x, $y);

     $r = ($rgb >> 16) & 0xFF;

     $g = ($rgb >> 8) & 0xFF;

     $b = $rgb & 0xFF;

     $luminance_running_sum = (0.30 * $r) + (0.59 * $g) + (0.11 * $b);

     return $luminance_running_sum;

}

echo”<img src=’dsc_0112×8.png’>”;//fichier source

if (filtre(”dsc_0112×8.png”,”out.jpg”)){

      echo” <img src=’out.jpg’>”;

}else{

      echo”erreur fichier source inexistant”;

}

?>

Autre essai avec une autre matrice plus grande:

0   0    1   0   0

0   0    0   0   0

1    0   -4   0   1

0   0    0   0   0

0   0    1    0   0

Diviseur 5   (les opérations sur les 0 ne sont pas faites)

out3.jpg

Autre exemple:

0   0    1   0   00   0    0   0   01    0   -3  0   10   0    0   0   00   0    1   0   0

Diviseur 5   (les opérations sur les 0 ne sont pas faites)

out4.jpg

Laissez un commentaire!

Voir aussi:

Flou sur une image
http://k12linux.mesd.k12.or.us/docs/gimp/fr/ch06s07s02.html
http://devernay.free.fr/cours/vision/pdf/c3.pdf
http://devernay.free.fr/cours/vision/pdf/c2.pdf
http://obligement.free.fr/articles/traitement_images_2.php
http://www.genie-des-maths.polymtl.ca/exemple.php?no=70
Effet damier

La même genre de chose mais en python:

http://pingswept.org/2009/03/16/calculating-solar-panel-shading-in-python/

février 17th, 2009 Posted by admin | Programmation web - php, Traitement image | one comment

Histogramme d’une image en php

La plupart des logiciels de retouches d’images disposent de fonctions permettant d’obtenir un histogramme d’une image suivant la luminance ou suivant les couleurs RVB.

Dans cet page nous réalisons l’histogramme de la luminance d’une image. La luminance prend une valeur différente pour chaque pixel de l’image suivant la couleur de celui-ci. La luminance est calculé avec une formule bien précise (Début de page).

Image de départ:

panneau.jpg

Traitement en php

function histogramme($file){

$key = 0;
$tab = array();
$x_dimension = 0;
$y_dimension = 0;
$image = 0;
$x = 0;
$y = 0;

//initialise le tableau (au cas ou il est des trous pour certaines valeurs)
$tab=array_fill(0, 255, ‘0′);

$image = imagecreatefromjpeg($file);
$x_dimension = imagesx($image);
$y_dimension = imagesy($image);

for ($x = 0; $x < $x_dimension; $x++) {
for ($y = 0; $y < $y_dimension; $y++) {
$key = pix_luminance($x,$y,$image);
$tab[$key]++;
}
}

// trie le tableau par ordre croissant des valeurs cles (Pas forcément nécessaire)
ksort($tab);

return $tab;
}

 Détail de la fonction:

La fonction va parcourir tout les pixels de l’image puis pour chacun de ces pixels elle va compter le nombre de pixels avec la même luminance. Il ne peut y a voir que 256 valeurs. Le tableau contient donc 256 clés avec pour chacunes une valeur correspondant aux nombres de pixels trouvés.  Afin d’éviter que l’histogramme soit déformé à cause de l’absence de pixel avec certaines valeurs de luminance on initialise chaque valeurs du tableau à 0.

La fonction retourne ensuite ce même tableau.

Pour déterminer la luminance de chaque pixels on utilise la fonction suivante:

//******************************************
// Retourne la luminance d’un pixel
//******************************************
function pix_luminance($x,$y,$image){

$luminance_running_sum=0;
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

$luminance_running_sum = (0.30 * $r) + (0.59 * $g) + (0.11 * $b);

return $luminance_running_sum;
}

L’affichage du résultat s’effectue en utilisant la librairie spécialisé.

On passe le tableau à une autre page qui à pour rôle de réaliser le graphique sous forme d’ image.

On affiche l’image dans la page en cour comme ceci:

<img src=’histogramme_graph.php?data=”.serialize($tab).”‘>

Le tableau est sérialisé afin qu’il puisse être transmis à une autre page par la méthode GET, en clair tout passe directement dans la barre d’url.

De l’autre coté la variable $data est déserialisé afin de récupérer le tableau. Puis l’affichage se fait simplement avec la librairie artichow en appelant la classe suivant ../lib/artichow/LinePlot.class.php. (Voir les nombreux exemples sur le site artichow)

Résultat:

Les graphs sont obtenus comme toujours avec la librairie php  artichow.

resultat_histogramme_graph.png

Pour vous convaincre du résultat voici ce qu’obtient le logiciel photoshop:

histogramme_luminence_photoshop.jpg

 Les fichiers

Pour reproduire tout ceci il vous faut télécharger la librairie artichow et la placer sur votre serveur puis les 2 fichiers suivant:

histogramme.php qui contient les fonctions, c’est le fichier que vous devrez exécuter pour apercevoir l’histogramme.

Et le fichier histogramme_graph.php  qui génère l’histogramme.

Vous devrez probablement modifier le chemin de la librairie artichow dans le fichier histogramme.php

Enfin voici l’exemple ici de se que vous devriez obtenir:

Il arrive!

Les fichiers sources:

histogramme.php.txt

histogramme_graph.php.txt

panneau.jpg

En rapport avec le traitement d’images en php:

Image couleur vers noir et blanc en php

Conversion en noir et blanc d’une image en php

http://www.neophoto.fr/post/2007/02/09/Comprendre-lhistogramme-dune-photo-et-les-niveaux-sous-Photoshop

Un code plus poussé d’un histogramme multi-courbes en php qui n’utilise pas la librairie artichow:

http://www.paris-beyrouth.org/Afficher-l-histogramme-d-une-image

D’autres exemples de traitements sur le même site en php:

http://www.paris-beyrouth.org/Modifier-les-courbes-d-une-image

http://www.paris-beyrouth.org/Un-site-avec-un-grain

http://www.paris-beyrouth.org/De-saturer-une-image-en-passant-en

http://www.paris-beyrouth.org/Creer-automatiquement-une

http://www.paris-beyrouth.org/Un-filtre-de-dispersion-graphique

http://www.paris-beyrouth.org/Etendre-la-couche-alphahttp://www.paris-beyrouth.org/Corriger-les-niveaux-des-images

janvier 4th, 2009 Posted by admin | Traitement image | no comments

Addition horizontale de pixels

Un moyen pour parvenir à séparer chaque lettres d’une ligne consiste à effectuer la somme des pixels sur chaque colonnes et de détecter les creux qui indiquent la présence d’un espace et donc de la lettre suivante.

Voici une image modifié afin de faire apparaitre plus facilement un résultat:

roc_texte_small1.png

Résultat du graphe (somme pixels de chaque colonnes):

graph_add_horizontal.png

Les résultat ici ne sont pas très intéressant car il ne donne qu’une simple idée de la forme de l’image. Il est plus intéressant d’effectuer le même traitement sur une ligne de caractères extraite avec le même procédé mais vus de droite ou de gauche.

Avec une ligne:

roc_ligne.png

Aperçu du graphique (somme des pixels vue de dessus ou dessous):

graph11.png

Aperçu du découpage:

Le seuil qui permet de déterminer si une ligne est vide est ici 1.

img_trace1.png

Le résultat obtenu au final:

(juste le début)

img_mav9.pngimg_mav9.pngimg_mav9.pngimg_mav9.pngimg_mav9.pngimg_mav9.png

Lien

Reconnaissance de caractères interressant depuis une vebcam

novembre 23rd, 2008 Posted by admin | ROC, Traitement image | no comments

Extraire les lignes dans une image php (Début ROC OCR)

Afin de réaliser un ROC en php il est nécessaire d’arriver à séparer les différentes lettres pour ensuite les analyser et les comparer à une librairie de caractères.

Avant cela il faut arriver a extraire les lignes d’un paragraphe. Voici un exemple:

roc_texte_small.png

Graphique du résultat de la somme de pixel noir vue de gauche ou de droite. (Le graph est généré par la librairie artichow)

On constate la première ligne plus large qui correspond au premier sommet sur le graphique… On voit aussi par la même occasion que les sommets dessines un 3 pics et 2 creux, le second pic plus petit que les 1 et le trois et le pic 3 plus grand que le premier et le second, cette caractéristique permettra de reconnaitre rapidement un texte à l’envers.

graph1.png

Aperçu de chaques lignes à extraire.

img_trace.png

Résultat, chaques lignes est extraite du paragraphe:

img_matrice1.png

img_matrice2.png

img_matrice3.png

img_matrice4.png

img_matrice5.png

Je proposerais prochainement ici le code complet d’un ocr primaire réalisé en php.

novembre 23rd, 2008 Posted by admin | ROC, Traitement image | one comment

Image couleur vers noir et blanc en php

Voici un petit scripte php qui permet de convertir une image couleur en noir et blanc (Niveau de gris en réalité)

Le principe de conversion est assez simple a réaliser, il consiste a récupérer la luminance de chacun des pixels de l’image en utilisant cette proportion:

luminance = (0.30 * R) + (0.59 * G) + (0.11 * B)

Avec R, G ou B une valeur comprise entre 0 et 255

En effet chaque pixel d’une image couleur est composé des valeurs R,G et B.

La transformation consiste ensuite à créer une image en remplacent les valeurs r,g et b par la valeur de la luminance pour chacun des pixels de l’image.

Le code:

function trans_to_nb($file,$file_out){if (file_exists($file)){
 
$image = imagecreatefromjpeg($file);
 
$x_dimension = imagesx($image);
 
$y_dimension = imagesy($image);
 
$new_image = imagecreatetruecolor($x_dimension, $y_dimension);//
 
for ($x = 0; $x &lt; $x_dimension; $x++) {
 
for ($y = 0; $y &lt; $y_dimension; $y++) {
 
$luminance_running_sum=0;
 
$rgb = imagecolorat($image, $x, $y);
 
$r = ($rgb &gt;&gt; 16) &amp; 0xFF;
 
$g = ($rgb &gt;&gt; 8) &amp; 0xFF;
 
$b = $rgb &amp; 0xFF;
 
$luminance_running_sum = (0.30 * $r) + (0.59 * $g) + (0.11 * $b);
 
$color = imagecolorallocate($image,
 
$luminance_running_sum,
 
$luminance_running_sum,
 
$luminance_running_sum
 
);
 
imagesetpixel($new_image, $x, $y, $color);
 
}
 
}
 
imagejpeg($new_image, $file_out);
 
return true;
 
}else{
 
return false;
 
}
 
}

Utilisation

if (trans_to_nb("test.jpg","out.jpg")){echo"<img src="http://www.electronika.fr/blog/wp-admin/out.jpg" />";
 
}
 
else
 
{
 
echo"erreur fichier source inexistant";
 
}

Exemple

test.jpgout.jpg

Attention, veillez a créer le fichier out.jpg dans le même répertoire que le scripte et donner au minimum les droits d’écriture sur out.jpg et de lecture sur test.jpg.

Le fichier source est ici

Autres liens sur le traitement d’images

http://perception.inrialpes.fr/people/Boyer/Teaching/L3/analyse.pdf

juin 21st, 2008 Posted by admin | Programmation web - php, Traitement image | one comment