FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» select intégrés
Transformations bijectives d'images: Photomaton et Boulanger Emptypar jjn4 Aujourd'hui à 18:33

» Aide de PANORAMIC
Transformations bijectives d'images: Photomaton et Boulanger Emptypar leclode Aujourd'hui à 18:23

» PANORAMIC V 1
Transformations bijectives d'images: Photomaton et Boulanger Emptypar Klaus Aujourd'hui à 9:53

» Je teste PANORAMIC V 1 beta 1
Transformations bijectives d'images: Photomaton et Boulanger Emptypar Klaus Aujourd'hui à 9:52

» bouton dans autre form que 0
Transformations bijectives d'images: Photomaton et Boulanger Emptypar leclode Hier à 13:59

» KGF_dll - nouvelles versions
Transformations bijectives d'images: Photomaton et Boulanger Emptypar Klaus Hier à 11:41

» Gestion d'un système client-serveur.
Transformations bijectives d'images: Photomaton et Boulanger Emptypar Klaus Hier à 10:23

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Transformations bijectives d'images: Photomaton et Boulanger Emptypar Froggy One Jeu 2 Mai 2024 - 11:16

» @Jack
Transformations bijectives d'images: Photomaton et Boulanger Emptypar Jack Mar 30 Avr 2024 - 20:40

» trop de fichiers en cours
Transformations bijectives d'images: Photomaton et Boulanger Emptypar papydall Lun 29 Avr 2024 - 23:39

» Une calculatrice en une ligne de programme
Transformations bijectives d'images: Photomaton et Boulanger Emptypar jean_debord Dim 28 Avr 2024 - 8:47

» Form(résolu)
Transformations bijectives d'images: Photomaton et Boulanger Emptypar leclode Sam 27 Avr 2024 - 17:59

» Bataille navale SM
Transformations bijectives d'images: Photomaton et Boulanger Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Les maths du crocodile
Transformations bijectives d'images: Photomaton et Boulanger Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
Transformations bijectives d'images: Photomaton et Boulanger Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
Le deal à ne pas rater :
Jeux, jouets et Lego : le deuxième à -50% (large sélection)
Voir le deal

 

 Transformations bijectives d'images: Photomaton et Boulanger

Aller en bas 
+3
Minibug
mindstorm
papydall
7 participants
AuteurMessage
papydall

papydall


Nombre de messages : 7004
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyDim 2 Oct 2022 - 1:29

Je vous propose un programme de transformations bijectives d'images.
Ce programme implémente les deux transformations bijectives d'images les plus connues :
La transformation du photomaton et la transformation du boulanger.
Le programme a besoin d'au moins une image bitmap sur laquelle il va travailler.
Il est fortement conseillé que les dimensions de l'image soient une puissace de deux (64 x 64 ou 128 x 128 ou 256 x 256 ou 512 x 512).

En lançant le programme, ce dernier vous propose de choisir la transformation du photomaton ou celle du boulanger qu'il va appliquer sur l'image d'origine.
Il enregistre dans le même dossier les différentes étapes de l'image traitée.

Pour le reste tout est expliqué dans le code.

Le code ainsi que les images se trouvent sur mon webdav dans le dossier Transformations_Images.zip

NB :
1) Adapter le chemin qui mène à Rome à votre dossier en ligne 95.
2) Vous pouvez utiliser en ligne 96 une autre image : earth ou lena ou lancelot ou votre propre image à la seule contrainte : ses dimensions doivent être une puissance de deux.
Il n'est pas obligatoire que l'image soit carrée.
Une image de dimensions 512 * 256 (ou 128 x 256) peut faire l'affaire.
Pour une image de dimensions paires (exp 300 x 200) mais pas une puissance de deux, la période serait longue, très longue.
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
papydall

papydall


Nombre de messages : 7004
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyDim 2 Oct 2022 - 1:35

Pour ceux qui veulent avoir le code (sans les images)

Code:

rem ============================================================================
rem            Transformations bijectives d’images
rem               Trans_Biject_Images.bas
rem ============================================================================
rem Wikipédia :
rem On appelle transformation bijective d’image une transformation d’une image
rem finie de n x m pixels sur elle-même :
rem Chaque pixel est donc déplacé et aucun pixel n’est perdu, ce qu’on appelle
rem en mathématiques une permutation de l’ensemble des pixels et en langage
rem courant un mélange.
rem De manière triviale, n applications de cette transformation redonnent l’image
rem initiale.
rem Cette propriété est générale : pour toute transformation bijective d’image,
rem il existe un plus petit entier k telle que appliquée k fois, la transformation
rem redonne l’image initiale.
rem ============================================================================
rem Les transformations bijectives d’images les plus connues sont
rem * La transformation du photomaton
rem * La transformation du boulanger (et sa variante le fer à cheval de Smale)
rem * La transformation de Hilbert
rem ============================================================================
rem Le nombre d’étapes avant de voir réapparaitre l’image est parfois très grand
rem et dépend d’une part de la transformation et d’autre part de la taille de
rem l’image.
rem Par exemple une image carrée dont le côté est une puissance de 2 reviendra
rem très vite, alors qu’avec deux nombres quelconques, le retour peut-être
rem extrêmement long.
rem Durant ces étapes, on passe parfois par des reconstitutions très proches de
rem l’image initiale.
rem ============================================================================
rem *** Transformation du photomaton
rem La transformation du cliché Photomaton est une description d’un type de
rem mélange analogue à un cliché Photomaton qui à partir d’une image en fabrique
rem quatre de plus petites dimensions, et ainsi de suite par itération.
rem Cette transformation est un cas particulier de transformations bijectives
rem d’images.
rem ============================================================================
rem Principe de la transformation du photomaton
rem Le principe de cette transformation est le suivant :
rem pour obtenir une nouvelle image, l’image originale est decomposée en 4 images
rem rétrécies récursivement.
rem L’image est tout d’abord découpée en carrés de 4 pixels (2 × 2) puis le pixel
rem en haut à droite de chaque carré sert à recomposer une image de taille 1/2
rem en haut à droite, idem pour la partie en haut à gauche, en bas à droite,
rem en bas à gauche.
rem Cette transformation ne fonctionne qu’avec des images dont la hauteur et la
rem largeur sont paires.
rem Si on répète un certain nombre de fois cette transformation, on retrouve
rem l’image de départ.
rem Le nombre d’itérations s’appelle période de retour.
rem Il se calcule comme suit pour une image de dimension 2n x 2m pixels :
rem On détermine le plus petit entier p tel que 2n-1 divise 2^p-1 ;
rem On détermine le plus petit entier k tel que 2m-1 divise 2^k-1 ;
rem On calcule le ppcm de p et k.
rem Le résultat obtenu est la période cherchée.
rem ============================================================================
rem Dans le cas où la taille de l’image est 2^p x 2^k, la période est ppcm(p,k).
rem Nous allons travailler avec des images carrées de dimensions une puissance
rem de deux, par exemple 256 x 256 ou 512 x 512.
rem De cette façon le calcul de la période sera simplifié et en plus le retour
rem à l’image d’origine sera rapide.
rem ============================================================================
rem Important :
rem Notez bien que les 4 images qui apparaissent après une étape de transformation
rem ne sont pas identiques comme elles le seraient avec l’appareil photographique
rem de la société Photomaton.
rem Les quatre images sont bien différentes au sens des pixels qu’elles contiennent.
rem Elles proviennent d’une redistribution des pixels de l’image initiale sans
rem aucune duplication ni perte.
rem ============================================================================
rem *** Transformation du boulanger
rem La transformation du boulanger est une transformation basée sur l’idée d’un
rem mélange analogue au pétrissage par un boulanger qui étire une pâte jusqu’à
rem ce qu’elle soit d’épaisseur moitié, puis la coupe en deux et superpose les
rem deux moitiés pour lui redonner sa dimension initiale, et ainsi de suite.
rem ============================================================================
rem La transformation du boulanger se définit sur [0,1]² de la façon suivante:
rem      ________________________________________________
rem     |                                                |
rem     |  S(x,y) = (2x  , y/2)        si 0 <= x <= 1/2  |
rem     |  S(x,y) = (2x-1, (y+1)/2)    sinon             |
rem     |________________________________________________|
rem
rem Une version alternative consiste à replier plutôt que couper et resuperposer
rem les deux demi-pâtons. C’est la transformation dite du fer à cheval de Smale.
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================

dim f$,fn$,ext$,n,p,t
dim largeur,hauteur : ' dimensions de l'image
dim exit
label clic
application_title "Transformations bijectives d’images"
dir_change "C:\Users\MICROTEK\Desktop\Transformations_Images" : ' Adapter le chemin
f$ = dir_current$ +"\joconde"
fn$ = f$ : ext$ = ".bmp"
Dimensions(fn$+ext$) : ' récuperer les dimensions (largeur et hauteur) de l'image
Menu()
create_hide
picture 10 : picture 20 : picture 30
alpha 11 : top 11,10 : left 11,largeur/2     : font_color 11,255,255,0
alpha 21 : top 21,10 : left 21,2*largeur     : font_color 21,255,255,0
alpha 31 : top 31,10 : left 31,3*largeur+150 : font_color 31,255,255,0  
end
rem ============================================================================
SUB Menu()
    dim_local i
    main_menu 1
        sub_menu 2 : parent 2,1 : caption 2,"Transformations"
        sub_menu 3 : parent 3,2 : caption 3,"Transformation du photomaton"
        sub_menu 4 : parent 4,2 : caption 4,"Transformation du boulanger"
        sub_menu 5 : parent 5,2 : caption 5,"-"
        sub_menu 6 : parent 6,2 : caption 6,"Quitter"
        sub_menu 7 : parent 7,1 : caption 7,"Aide"
        sub_menu 8 : parent 8,7 : caption 8,"Infos"
        sub_menu 9 : parent 9,7 : caption 9,"A-Propos"
    for i = 3 to 9 : on_click i,clic : next i        
END_SUB
rem ============================================================================
Clic:
    select number_click
        case 3 : GUI_Photomaton()
        case 4 : GUI_Boulanger()
        case 6 : Quitter()
        case 8 : Infos()
        case 9 : Propos()
    end_select
return
rem ============================================================================
SUB GUI_Photomaton()
    width 0,2*largeur+100 : height 0,hauteur +200 : color 0,100,50,20  
    width 10,largeur : height 10,hauteur : top 10,50 : left 10,50
    width 20,largeur : height 20,hauteur : top 20,50 : left 20,50+width(10)+10
    show 10 : show 20
    p = Periode(largeur,hauteur)
    Traitement_Photomaton(p)
END_SUB
rem ============================================================================
' Traitement
SUB Traitement_Photomaton(p)
    dim_local n,im$
    inactive 2 : inactive 7
    exit = 0
    im$ = f$ + "_Photomathon"
    for n = 1 to p
        caption 0,"Transformation du Photomaton. Traitement en cours ..." + str$(n) + " / " + str$(p) + " ... <ESC> pour arrêter"
        2d_target_is 10 : file_load 10,fn$ + ext$
        2d_target_is 20 : cls
        Photomaton()
        if exit = 1 then active 2 : active 7 : exit_sub
        file_save 20,im$ + "_" + str$(n) + ext$
        fn$ = im$ + "_" + str$(n)
    next n
    caption 0,"Traitement terminé. On retrouve bien l'image de départ"
    active 2 : active 7
END_SUB
rem ============================================================================
SUB Photomaton()
    dim_local x,y,nx,ny,r,g,b
    for x = 0 to largeur-1
        for y = 0 to hauteur-1
            r = color_pixel_red(10,x,y)
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)
            if (even(x) = 1) and (even(y) = 1) : ' x et y sont pairs
               nx = int(x/2) : ny = int(y/2)
            else
               if even(x) = 1                  : ' x est pair et y impair
                  nx = int(x/2) : ny = int(hauteur/2) + int(y/2)
               else
                  if even(y) = 1               : ' x est impair et y pair
                     nx = int(largeur/2) + int(x/2) : ny = int(y/2)
                  else                         : ' x et y sont impairs
                     nx = int(largeur/2) + int(x/2) : ny = int(hauteur/2) + int(y/2)
                  end_if
               end_if
            end_if
            2d_pen_color r,g,b : 2d_point nx,ny
            if scancode = 27 then exit = 1 : exit_sub
        next y
        display
    next x

END_SUB
rem ============================================================================
SUB GUI_Boulanger()
    width 0,4*Largeur+200 : height 0,Hauteur + 200 : color 0,100,50,20  
    width 10,Largeur : height 10,Hauteur : top 10,30 : left 10,50
    width 20,2*Largeur : height 20,Hauteur : top 20,30 : left 20,50+width(10)+10
    width 30,largeur : height 30,hauteur : top 30,30 : left 30,3*largeur + 70    
    show_all
    p = 2 * Periode(Largeur,Hauteur) + 1
    Traitement_Boulanger(p)
END_SUB
rem ============================================================================
SUB Traitement_Boulanger(p)
    2d_target_is 10 : file_load 10,fn$ + ext$ : caption 11,"Etape 0"
    2d_target_is 20  
    All_Boulanger(p)
END_SUB
rem ============================================================================
' Visualiser l'ensemble des transformations du boulanger
' avant le retour à l'image initiale
SUB All_Boulanger(p)
    dim_local n,im$
    2d_target_is 10
    inactive 2 : inactive 7
    im$ = f$ + "_Boulanger"
    exit = 0
    for n = 1 to p
        caption 0,"Transformation du boulanger. Traitement en cours ..." + str$(n) + " / " + str$(p) + " ... <ESC> pour arrêter"        
        2d_target_is 10 : file_load 10,fn$ + ext$
        2d_target_is 30 : cls
        2d_target_is 20 : cls        
        Boulanger_Etirer(n)  : if exit = 1 then active 2 : active 7 :  exit_sub
        Boulanger_Replier(n) : if exit = 1 then active 2 : active 7 : exit_sub      
        file_save 30,im$ + "_" + str$(n) + ext$        
        fn$ = im$ + "_" + str$(n)
        caption 11,"Etape " + str$(n)
    next n  
    2d_target_is 10 : file_load 10,f$ + ext$
    2d_target_is 20 : cls
    caption 0,"Traitement terminé. On retrouve bien l'image de départ"
    caption 11,"Image de départ"
    caption 21,""
    caption 31,"Etape " + str$(p)
    active 2 : active 7
END_SUB
rem ============================================================================
SUB Boulanger_Etirer(n)
    dim_local x,y,x1,y1,r,g,b,nx,ny
    caption 21,"Etirement " + str$(n)    
    for x = 0 to largeur-1
        for y = 0 to hauteur-1
            r = color_pixel_red(10,x,y)
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)            
            if even(y) = 1
               nx = 2*x : ny = int(y/2)
            else
               nx = 2*x+1 : ny = int(y/2)
            end_if                                            
            2d_pen_color r,g,b : 2d_point nx,ny
            if scancode = 27 then exit = 1 : exit_sub
        next y
        display
    next x
END_SUB
rem ============================================================================
SUB Boulanger_Replier(n)
    dim_local x,y,x1,y1,r,g,b,nx,ny,h,l
    caption 31,"Repliement " + str$(n)
    2d_target_is 30 : cls
    h = hauteur/2
    l = 2*largeur
    for x = 0 to l-1
        for y = 0 to h-1
            r = color_pixel_red(20,x,y)
            g = color_pixel_green(20,x,y)
            b = color_pixel_blue(20,x,y)            
            if x < int(l/2)      
               nx = x : ny = y
            else
               nx = l-x-1 : ny = 2*h-y-1
            end_if                                                        
            2d_pen_color r,g,b : 2d_point nx,ny
            if scancode = 27 then exit = 1 : exit_sub
        next y
        display
    next x
    caption 31,""
END_SUB
rem ============================================================================
' Récuperer les dimensions (largeur et hauteur) de l'image image$
SUB Dimensions(image$)
    filebin_open_read 999,image$
    filebin_position 999,18
    largeur = filebin_read(999) + 256 * filebin_read(999)
    filebin_position 999,22
    hauteur = filebin_read(999) + 256 * filebin_read(999)
    filebin_close 999
END_SUB
rem ============================================================================
' Fonction Plus Grand Commun Diviseur de deux entiers a et b
' Cette fonction sera utilisée dans le calcul du nombre d'étapes pour réaliser
' la transformation.
FNC PGCD(a,b)
    dim_local r
    a = abs(a) : b = abs(b)
    if a > b then r = b : b = a : a = r
    repeat
        r = mod(a,b) : a = b : b = r
    until r = 0
    result a
END_FNC
rem ============================================================================
' Fonction retournant la période (nombre de transformations)
FNC Periode(p1,p2)
    dim_local q1,q2
    q1 = 0
    repeat
        q1 = q1 + 1
    until mod(power(2,q1)-1,p1-1) = 0
    q2 = 0
    repeat
        q2 = q2 + 1
    until mod(power(2,q2)-1,p2-1) = 0
    result int(q1*q2 / pgcd(q1,q2))
END_FNC
rem ============================================================================
SUB Quitter()
    if message_confirmation_yes_no("Vous voulez vraiment quitter ?") = 1
       terminate
    end_if
END_SUB
rem ============================================================================
SUB Infos()
    dim_local t$
    t$ = "Une transformation bijective d'une image déplace les points d'une image d'un endroit à un autre sans en ajouter ni en enlever aucun." + chr$(13)
    t$ = t$ + "Une propriété remarquable de ces transformations bijectives est qu'elles reviennent toujours au point de départ après un nombre d'applications plus ou moins important." + chr$(13) + chr$(13)
    t$ = t$ + "Ce programme traite les deux plus importantes transformations les plus connues à savoir la transformation du photomaton et la tranformation du boulanger."+chr$(13)
    t$ = t$ + "La transformation du photomaton consiste à réaliser l’opération suivante sur les numéros des lignes : " + chr$(13)
    t$ = t$ + "On prend les lignes de rang pair qu’on fait suivre de celles de numéro impair." + chr$(13)
    t$ = t$ + "De même, pour les numéros des colonnes — cela explique l’apparition de quatre versions en plus petit de l’image initiale." + chr$(13) + chr$(13)
    t$ = t$ + "La transformation du boulanger s’appelle ainsi car elle s’apparente au travail du boulanger qui réalise une pâte feuilletée."+chr$(13)
    t$ = t$ + "L’image est tout d’abord étirée puis coupée en deux dans le sens vertical pour placer la partie de droite sous la partie gauche en la faisant tourner de 180°"+chr$(13)
    t$ = t$ + "La transformation du boulanger est donc la succession d’un étirement et d’un repliement." + chr$(13)
    t$ = t$ + "Partant d’un tableau n x n on obtinet encore un tableau n x n."+chr$(13)
    t$ = t$ + "On part d’un tableau n × n, avec n pair dont chaque élément représente un pixel."+chr$(13)
    t$ = t$ + "On va appliquer deux transformations élémentaires à chaque fois :"+chr$(13)
    t$ = t$ + " 1 / Étirer." +chr$(13)
    t$ = t$ + "Le principe est le suivant :"+chr$(13)
    t$ = t$ + "les deux premières lignes (chacune de longueur n) produisent une seule ligne de longueur 2n en mixant les valeurs de chaque ligne en alternant un élément du haut, un élément du bas."+chr$(13)
    t$ = t$ + " 2 / Replier."+chr$(13)
    t$ = t$ + "Le principe est le suivant : "+chr$(13)
    t$ = t$ + "la partie droite d’un tableau étiré est retournée (en la faisant tourner de 180°), puis ajoutée sous la partie gauche."+chr$(13)
    t$ = t$ + "Pour que cette tranformation soit bien définie, il est nécessaire que les dimensions de l’image soient paires."+chr$(13)
    t$ = t$ + "Partant d’un tableau n/2 × 2n on obtient un tableau n × n."
    message t$
END_SUB
rem ============================================================================
SUB Propos()
    dim_local t$
    t$ = "Transformations bijectives d'images : transformations du photomaton et du boulanger" + chr$(13)
    t$ = t$ + "Auteur : Papydall" + chr$(13)
    t$ = t$ + "Date   : 30 / 09 / 2022" + chr$(13)
    t$ = t$ + "Dernière modif : 01 / 10 / 2022"
    message t$
END_SUB
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyDim 2 Oct 2022 - 9:07

Une application de la transformation du boulangé,
La pâte feuilleté.
Impeccable pour ce dimanche matin.
Plus sérieusement, la transformation du photomaton ne peut elle pas tromper un algorithme de contrôle d'image?
merci pour tes productions
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyDim 2 Oct 2022 - 10:48

Bonjour Papydall,

Encore des merveilles avec des formules...
Mais c'est pas un peu trop compliqué pour un dimanche matin Question Exclamation

Mindstorm a écrit:
Une application de la transformation du boulangé, La pâte feuilleté.
Et pour la pâte à pizza ? Ok je sors...
lol! lol! lol!
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
papydall

papydall


Nombre de messages : 7004
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyDim 2 Oct 2022 - 14:33

La couleur c'est bien, mais le gris c'est aussi beau!

Code:

rem ============================================================================
rem                 Traitement d’images
rem                  Couleur ===> Gris
rem ============================================================================
dim Largeur, Hauteur
dim image$

image$ = "D:\Langages\Panoramic\Versions\V09.29i11\Image\1.bmp" : ' à adapter
Dimensions(image$)
width 0, 2*Largeur + 100
height 0, Hauteur + 100

picture 10 : width 10,Largeur : height 10,Hauteur
top 10,40 : left 10,50 : 2d_target_is 10 : file_load 10,image$
picture 20 : width 20,Largeur : height 20,Hauteur
top 20,40 : left 20,50+Largeur + 10

Gris()

end
rem ============================================================================
' Obtention d'une image en gris à partir d'une image initiale en couleur
SUB Gris()
    dim_local x,y,nx,ny,r,g,b,c
    2d_target_is 20
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)
            c = (r+g+b)/3
            2d_pen_color c,c,c
            2d_point x,y
        next x
        display
    next y
    
END_SUB
rem ============================================================================
' Récuperer les dimensions (Largeur_Image et Hauteur_Image) de l'image image$
SUB Dimensions(image$)
    filebin_open_read 999,image$
    filebin_position 999,18
    Largeur = filebin_read(999) + 256 * filebin_read(999)
    filebin_position 999,22
    Hauteur = filebin_read(999) + 256 * filebin_read(999)
    filebin_close 999

END_SUB
rem ============================================================================



Résultat:


Dernière édition par papydall le Mer 5 Oct 2022 - 7:13, édité 1 fois
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyDim 2 Oct 2022 - 15:21

C'est vrai que c'est beau, je mets de côté.

J'ai plein d'images N/B d'autrefois, ça serait bien aussi d'avoir la sub inverse pour
les convertir en couleurs... bon OK, je sors aussi...

PS:
Je reviens quand même pour une remarque, au passage:
il y a une fonction de KGF.DLL de l'ami Klaus qui fait la conversion en niveaux de gris
très rapidement: 'SetPictureGrayScale'
Revenir en haut Aller en bas
jean_debord

jean_debord


Nombre de messages : 1250
Age : 69
Localisation : Limoges
Date d'inscription : 21/09/2008

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyLun 3 Oct 2022 - 17:11

Excellent ! Merci papydall !

Je vais essayer de faire des procédures en FreeBASIC pour aller plus vite.

Si j'y arrive je les mettrai dans FBCroco.
Revenir en haut Aller en bas
http://www.unilim.fr/pages_perso/jean.debord/index.htm
Marc

Marc


Nombre de messages : 2390
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyLun 3 Oct 2022 - 21:41

Bravo et merci Papydall pour ces deux excellents programmes ! cheers
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7004
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyMer 5 Oct 2022 - 7:04

Merci jean_debord
merci Marc

JL35 a écrit:
J'ai plein d'images N/B d'autrefois, ça serait bien aussi d'avoir la sub inverse pour
les convertir en couleurs... bon OK, je sors aussi...

Malheureusement ce n'est pas possible !
Le gris est obtenu en faisant la moyenne arithmétique de trois composantes RVB de l'image en couleur:
C = (R + V + B) / 3
La réciproque n'est pas possible car à partir de la composante C, on ne peut pas obtenir RVB
Par exemple :
Si C = 80 alors RVB peuvent être
R = 100 , V = 100 , B = 40
R = 0, V = 0, B = 240
R = 10, V = 20, B = 210
etc.. etc..

On peut imaginer des pseudo-couleurs calculées à partir de C en donnant aux trois composantes RVB un certain pourcentage (forcement arbitraire)
Par exemple :
R = 0.6 * C
V = 0.3 * C
B = 0.1 * C
J'ai essayé cette methode sur une image en noir et blanc

Voici ce que ça donne:

C'est un peu plus gai, mais guère satisfaisant.


Pour finir, voici un autre code

Code:

rem ============================================================================
rem                 Traitement d’images
rem                    Par Papydall
rem ============================================================================
dim Largeur, Hauteur
dim image$
dim i
label clic
image$ = "c:\users\microtek\desktop\Traitement_Images\lena.bmp" : ' à adapter
Dimensions(image$)
width 0, 2*Largeur + 400
if Hauteur < 500
   height 0, 600
else
   height 0,Hauteur + 100
end_if

picture 10 : width 10,Largeur : height 10,Hauteur
top 10,40 : left 10,365 : 2d_target_is 10 : file_load 10,image$
picture 20 : width 20,Largeur : height 20,Hauteur
top 20,40 : left 20,350+Largeur + 20
alpha 23 : top 23,10 : left 23,300+largeur/2 : caption 23,"Image originale"
font_bold 23 : font_color 23,0,0,255 : font_size 23,12
alpha 24 : top 24,10 : left 24,280+3*largeur/2 : caption 24,"Image traitée"
font_bold 24 : font_color 24,0,0,255 : font_size 24,12 : hide 24
container_option 25 : top 25,20 : left 25,10 : font_bold 25 : font_color 25,255,0,0
width 25,350 : height 25,400 : font_size 25,14 : caption 25,"Faites votre choix"
for i = 30 to 41
    option i : parent i,25
    top i,50+(i-30)*30 : left i,20 : width i,320 : font_bold i
    font_color i,0,0,255 :  font_size i,10
     on_click i,clic
next i
caption 30," Eclaircir l'image "
caption 31," Eliminer les couleurs,excepté le rouge"
caption 32," Eliminer les couleurs,excepté le vert "
caption 33," Eliminer les couleurs,excepté le bleu "
caption 34," Créer le négatif de l'image "
caption 35," Convertir l'image couleur en noir et blanc "
caption 36," Convertir l'image couleur en nuances de sépia "
caption 37," Modifier le contrast "
caption 38," Symétrie axiale d'axe horizontal "
caption 39," Symétrie axiale d'axe vertical "
caption 40," Afficher l'image dans une ellipse ou un cercle "
caption 41," QUITTER LE PROGRAMME "

font_bold 0 : font_color 0,255,0,0 : font_size 0,10
print_locate 20,top(25)+height(25)+20
print "Dimensions de l'image originale : " + str$(largeur) + " x " + str$(hauteur) + " pixels"

end
rem ============================================================================
Clic:
    for i = 30 to 40 : inactive i : next i
    show 24
    select number_click
        case 30 : Lumineuse()
        case 31 : Rouge()
        case 32 : Vert()
        case 33 : Bleu()
        case 34 : Negatif()
        case 35 : Gris()
        case 36 : Sepia()
        case 37 : Modifier_Contrast()
        case 38 : Symetrie_Horizontale()
        case 39 : Symetrie_Verticale()
        case 40 : Ellipse()
        case 41 : terminate
    end_select
    for i = 30 to 40 : active i : next i
return
rem ============================================================================
' Rendre l'image plus lumineuse
SUB Lumineuse()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Rendre l'image plus lumineuse"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)   : r = min(r+30,255)
            g = color_pixel_green(10,x,y) : g = min(g+30,255)
            b = color_pixel_blue(10,x,y)  : b = min(b+30,255)
            2d_pen_color r,g,b : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Eliminer toutes les couleurs, excepté le rouge
SUB Rouge()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Eliminer toutes les couleurs, excepté le rouge"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y) : g = 0 : b = 0  
            2d_pen_color r,g,b : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Eliminer toutes les couleurs, excepté le vert
SUB Vert()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Eliminer toutes les couleurs, excepté le vert"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            g = color_pixel_red(10,x,y) : r = 0 : b = 0  
            2d_pen_color r,g,b : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Eliminer toutes les couleurs, excepté le bleu
SUB Bleu()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Eliminer totes les couleurs, excepté le bleu"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            b = color_pixel_red(10,x,y) : r = 0 : g = 0  
            2d_pen_color r,g,b : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Créer le négatif de l'image
SUB Negatif()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Créer le négatif de l'image"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)   : r = 255-r
            g = color_pixel_green(10,x,y) : g = 255-g
            b = color_pixel_blue(10,x,y)  : b = 255-b
            2d_pen_color r,g,b : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Convertir l'image couleur en noir et blanc
SUB Gris()
    dim_local x,y,r,g,b,c
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Convertir l'image couleur en noir et blanc"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)  
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)
            ' formule standard donnant le niveau de gris en fonction
            ' des 3 composantes RGB  
            c = 0.299*r + 0.587*g + 0.114*b
            2d_pen_color c,c,c : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Convertir l'image couleur en nuances de sépia
SUB Sepia()
    dim_local x,y,r,g,b,r1,g1,b1
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Convertir l'image couleur en nuances de sépia"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)  
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)
          
            r1 = 0.393*r + 0.769*g + 0.189*b : if r1 > 255 then r1 = 255
            g1 = 0.349*r + 0.686*g + 0.168*b : if g1 > 255 then g1 = 255
            b1 = 0.272*r + 0.534*g + 0.131*b : if b1 > 255 then b1 = 255
            2d_pen_color r1,g1,b1 : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Modifier le contrast de l'image
SUB Modifier_Contrast()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Modifier le contrast de l'image"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)  
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)
            if r < 30 then r = 0
            if g < 30 then g = 0
            if b < 30 then b = 0
            if (r >= 30) and (r < 225) then r = int(255/195*(r-30)+0.5)
            if (g >= 30) and (g < 225) then g = int(255/195*(g-30)+0.5)
            if (b >= 30) and (b < 225) then b = int(255/195*(b-30)+0.5)            
            2d_pen_color r,g,b : 2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Produire une symétrie axiale d'axe horizontal
SUB Symetrie_Horizontale()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Créer une symétrie horizontale"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)  
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)  
            2d_pen_color r,g,b : 2d_point x,hauteur-y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Produire une symétrie axiale d'axe vertical
SUB Symetrie_Verticale()
    dim_local x,y,r,g,b
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Créer une symétrie verticale"
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)  
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)  
            2d_pen_color r,g,b : 2d_point largeur-x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Afficher l'image dans un cercle si l'image est carrée, dans une ellipse si
' l'image est rectangulaire
SUB Ellipse()
    dim_local x,y,r,g,b,r1,r2,xc,yc ,p
    2d_target_is 20 :cls
    caption 0,"Traitement en cours ... Affichage dans une ellipse"
    r1 = largeur/2 : r2 = hauteur/2
    xc = r1 : yc = r2
    r1 = r1-1 : r2 = r2-1
    for y = 0 to hauteur-1
        for x = 0 to largeur-1
            r = color_pixel_red(10,x,y)  
            g = color_pixel_green(10,x,y)
            b = color_pixel_blue(10,x,y)
            ' Determiner si le point (x,y) est à l'interieur de l'ellipse
            p = (power((x-xc),2) / power(r1,2)) + (power((y-yc),2) / power(r2,2))
            if p < 1                    : ' Le point (x,y) est à l'intérieur
               2d_pen_color r,g,b       : ' on le trace en couleur RGB
            else                        : ' Le point (x,y) est à l'extérieur
               2d_pen_color 255,255,255 : ' on le trace en blanc
            end_if
            2d_point x,y
        next x
        display
    next y
    caption 0,"Traitement terminé"
END_SUB
rem ============================================================================
' Recupérer les dimensions (Largeur_Image et Hauteur_Image) de l'image image$
SUB Dimensions(image$)
    filebin_open_read 999,image$
    filebin_position 999,18
    Largeur = filebin_read(999) + 256 * filebin_read(999)
    filebin_position 999,22
    Hauteur = filebin_read(999) + 256 * filebin_read(999)
    filebin_close 999

END_SUB
rem ============================================================================

Voici un aperçu de la dernière option du programme:
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyMer 5 Oct 2022 - 7:49

Intéressant tout ça !

Merci Papydall pour le partage et très heureux de te revoir parmi nous. Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyMer 5 Oct 2022 - 10:04

C'était pour plaisanter,  je savais bien que ce n'était pas possible de reconstituer les couleurs
à partir du noir et blanc...
Mais bon sang papydall, tes exemples sont spectaculaires !
Je vais regarder ça de plus près !

PS
Concernant la conversion d'une image couleurs en niveaux de gris, je me suis dit
qu'en opérant directement dans le fichier source de l'image ce serait beaucoup
plus rapide que pixel par pixel à l'écran. comme tu as fait papydall...
eh bien non, c'est aussi long !

Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyMer 5 Oct 2022 - 19:42

@papydall
Des coefficients de luminance existent bel et bien, ont peut les trouver sur wikipédia. Ils valent :
Y = 0.2126*R + 0.7152*V + 0.0722*B
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2390
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyLun 24 Oct 2022 - 19:07

Bonjour à tous !

Je vous propose un traitement d'image : Gris --> Couleur

Spoiler:


Une connexion Internet est nécessaire.

Code:


' ****************************************
' *                                      *
' *        Coloriser les images          *
' *                                      *
' *  Plusieurs filtres sont disponibles  *
' *                                      *
' *                                      *
' ****************************************
'
'
execute "https://palette.fm/"
end
Revenir en haut Aller en bas
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyLun 24 Oct 2022 - 19:45

Intéressant et facile celui-ci, pour redonner de l'éclat
aux vieilles photos d'archives en noir et blanc.
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger EmptyLun 24 Oct 2022 - 20:41

Ah oui merci Marc cheers

Très facile oui et en plus les résultats font relativement naturels.
A garder précieusement. Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Contenu sponsorisé





Transformations bijectives d'images: Photomaton et Boulanger Empty
MessageSujet: Re: Transformations bijectives d'images: Photomaton et Boulanger   Transformations bijectives d'images: Photomaton et Boulanger Empty

Revenir en haut Aller en bas
 
Transformations bijectives d'images: Photomaton et Boulanger
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Les transformations affines
» Mathématiques pour les transformations du plan

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: