Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Soustraction d'images binaires


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Soustraction d'images binaires
    Bonjour,

    Avant de me lancer dans ce domaine qui me paraît encore bien flou je voulais demander si par hasard quelqu'un avait déjà effectué ce genre de traitement si je suis à côté de la plaque ou non.
    J'ai deux images de taille identique. L'une comprend une grille et un texte superposé et une autre qui ne contient que la grille identique à celle de la première image.
    J'espérais pouvoir extraire le texte seul de l'image en utilisant un opérateur XOR ou consorts.
    En gros seuls les pixels noirs de la grille qui touchent un pixel blanc du fond de l'image devraient être supprimés.
    Serait-ce bien possible?

    Merci à vous.

  2. #2
    Membre chevronné
    Soustraction d'images binaires
    Bonjour,

    Il faut d'abord attribuer une valeur numérique aux deux couleurs:
    # noir = (0, 0, 0) = ($00, $00, $00) = ({00000000}, ... etc); soit (0) au niveau de chaque bit;
    # blanc = (255, 255, 255) = ($FF, $FF, $FF) ) ({11111111}, ... etc); soit (1) au niveau de chaque bit.

    Le bon opérateur binaire (H) sera donc caractérisé par la table suivante (x = (grille + texte), y = (grille seule)):
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (x)H(y)    y = 0    y = 1
    x = 0        0        1
    x = 1     0 ou 1(*)   1

    (*) Ce cas ne se présente pas.

    Prendre (1)H(0) = 0 revient à prendre (x)H(y) ≡ y ;
    l'option (1)H(0) = 1 devrait correspondre à un opérateur classique.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  3. #3
    Expert éminent sénior
    Bonjour

    Non.
    Dans le cas général, non.
    Tu as mis dans le mille en parlant de XOR, mais ce "OU EXCLUSIF" va supprimer des bouts de motifs.
    Et la seule façon d'éviter cela est la prédiction. Si tu as 1110000001000000111 pour décrire le haut du "B" de "Bonjour", c'est probablement que le fait d'enlever la grille a défiguré la continuité. Et tu peux réparer en 1110000000000000111.
    Même en rétablissant la continuité, tu auras des effets de bords, comme quand on détache un morceau de plastique en ouvrant un jouet, il reste toujours un petit bout qui dépasse. Ta grille fera pareil.

    Quelle est la taille du motif par rapport à la taille de la grille ?
    Le motif a-t-il des bords francs et nets ?
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Membre habitué
    J'extrairais d'abord la grille puisqu'elle est symétrique, continue et "attendue" et reconstruirais les parties manquantes du motif par extrapolation et en exploitant les données locales de la grille.
    Savoir pour comprendre et vice versa.

  5. #5
    Membre chevronné
    Soustraction d'images binaires
    Désolé, j'ai pris l'énoncé à l'envers, et comptais enlever le texte de la grille, ce qui m'a paru après coup franchement incohérent.

    En reprenant la même notation des couleurs (noir = 0 , blanc = 1), la table de l'opérateur devient:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (x)H(y)    y = 0    y = 1
    x = 0        1        0
    x = 1        1        1

    Il s'agit apparemment de l'opération (x)AND(NOT y) .

    Je m'en suis strictement tenu, selon le titre de la discussion, au traitement d'images à deux couleurs. La présence éventuelle de dégradés complique évidemment le problème.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  6. #6
    Expert éminent sénior
    Citation Envoyé par wiwaxia Voir le message
    Il s'agit apparemment de l'opération (x)AND(NOT y) .
    Euh ... Doute. Avec cette formule, si x est nul alors le résultat est forcément nul. Impossible. Cela ne va pas corriger les choses.

    La bonne réponse est simplement x ⊕ y ⊕ 1. (où ⊕ symbolise le "OU EXCLUSIF")
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Membre du Club
    Holà! Merci pour vos réponses.

    Wiwax tu m'as fait m'endormir encore plus nul que je pensais l'être car je n'avais pas trop compris voire pas du tout mais là tu me rassures un peu.

    Flobel comme tu dis en supprimant la grille on supprime les pixels du texte traversé par la grille.
    la taille du motif par rapport à la taille de la grille est complètement imprévisible; en fait j'extrais du texte manuscrit ou imprimé de feuilles jusqu'à A4 maximum où on peut avoir des graphiques, des tableaux, des traits, etc.
    Je dirais que le motif a des bords francs et nets à partir du moment où l'image est filtrée et il ne reste plus que des pixels noirs ou blancs.

    La nuit portant conseil je pense avoir trouvé une solution qui devrait marcher.

    En fait pour tout pixel noir de la grille (image de droite) qui a un pixel blanc au Nord, Est, Sud ou Ouest et si ce même pixel blanc est blanc sur l'image de gauche alors on peut supprimer le pixel noir.
    Si le pixel voisin était noir dans l'image de gauche ça voudrait dire qu'il appartient au texte.
    J'espère que c'est clair.

  8. #8
    Membre expert
    Salut pourquoi pas simplement faire une comparaison ? On parcours tous les pixels de l'image de B si le pixel courant n'est pas de la même couleur que le pixel de l'image A alors on l'inscrit le pixel de l'image A dans une image C. plus simple non ? ou encore une simple différence (xor) --> voici le résultat à partir des tes 2 images



    Suffit plus qu'a inverser le blanc et noir

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Membre expert
    Voici un mode de fusion "phoenix" qui fais le job sans avoir besoin d'inverser le blanc et noir



    voici le code pascal

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        cmPhoenix :
        Begin
          Result.Red := ClampByte(Math.Min(A.Red, Self.Red) - Math.Max(A.Red, Self.Red) + 255);
          Result.Green := ClampByte(Math.Min(A.Green, Self.Green) - Math.Max(A.Green, Self.Green) + 255);
          Result.Blue := ClampByte(Math.Min(A.Blue, Self.Blue) - Math.Max(A.Blue, Self.Blue) + 255);
        end;


    Self = Image 1
    A = Image 2

    EDIT : le texte au complet il faudra donc rajouter une passe supplémentaire avec l'image 2 pour combler les trous
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Membre du Club
    Merci Beanz,

    Comme tu le dis et le montres, en effet les pixels internes au texte sont supprimés donc il faut refaire une double boucle (x, y) pour combler les trous.
    La méthode que j'avais citée se fait dans la double boucle de départ avec seulement 4 conditions supplémentaires.
    J'essaie de grappiller les chouias de seconde où je peux.
    Ici j'avais donné un exemple simple mais en réalité la plupart des textes ont une épaisseur d'un pixel et tu sais mieux que moi que lorsqu'on fait les premiers tests ont tombent sur toutes les exceptions qu'on n'avait pas imaginées (caractère traversé par un trait, un accent ou un point de l'autre côté de la ligne, etc).

    Merci pour ton code il va me servir pour d'autres méthodes en cours et d'approfondir les opérateurs XOR etc.

###raw>template_hook.ano_emploi###