12
votes

Comment fonctionne un masque ingraisseur?

Je joue avec le traitement de l'image ces derniers temps, et j'aimerais savoir comment fonctionne l'algorithme de masque Unsharp. Je regarde le code source de GIMP et c'est la mise en œuvre, mais je suis toujours dans le noir sur la façon dont cela fonctionne réellement. Je dois la mettre en œuvre pour un projet que je travaille, mais j'aimerais bien comprendre l'algorithme que j'utilise.


1 commentaires

Est-ce que quelqu'un a réussi à reproduire le masque ingrat de Photoshop?


5 Réponses :


4
votes

masque non blindé fonctionne en générant une version floue de l'image à l'aide d'un filtre de flou gaussien, puis soustrayez-la de l'image d'origine (avec une valeur de pondération appliquée), c'est-à-dire

blurred_image = blur(input_image)
output_image = input_image - blurred_image * weight


0 commentaires

10
votes

La clé est l'idée de fréquence spatiale . Un filtre gaussien ne passe que les basses fréquences spatiales , donc si vous faites quelque chose comme:

2 * (image d'origine) - (image filtrée gaussienne)

alors c'est l'effet dans le domaine de fréquence spacial est:

(2 * toutes les fréquences) - (basses fréquences) = (2 * hautes fréquences) + (1 * basses fréquences).

Ainsi, en vigueur, un "masque ingraisseur", augmente les composants à haute fréquence de l'image --- Les paramètres exacts de la taille du filtre gaussien et les poids lorsque les images sont soustraites déterminer les propriétés exactes du filtre. .


1 commentaires

Il semble que vous soyez dans le traitement de l'image - pourriez-vous nous aider à ouvrir ce groupe dédié: zone51.stackexchange.com/proposals/66531/computer-vision/720 84 Il suffit de voter aux questions avec moins de 10 votes. Merci.



32
votes

Je ne savais pas comment cela a fonctionné non plus mais je suis tombé sur deux de bonnes pages pour la comprendre. Fondamentalement, ça va comme ça:

  1. Quel est le contraire d'une image aiguisée? Une floue. Nous savons brouiller une image. Dupliquer l'image d'origine et effectuer des floues gaussiennes. Ceci est le curseur radius em> sur la plupart des dialogues USM. LI>
  2. Eh bien, si nous soustrayons la flou, nous devrions être laissés avec les pièces qui sont en contraste à fort contraste! Pensez-y: Si vous brouillez un ciel, cela ressemble toujours à un ciel. Soustrayez les pixels et vous obtenez Sky - Sky = 0. Si vous flouez un logo de coke, vous obtenez un logo de coke flou. Soustrayez-le et vous êtes laissé avec les bords. Alors faites la différence li>
  3. Bien ce qui fait que les choses ont l'air plus nette? Contraste. Dupliquez à nouveau l'image d'origine et augmentez le contraste. Le montant dont vous augmentez le contraste est le montant em> ou l'intensité em> curseur sur la plupart des dialogues USM. LI>
  4. finalement tout mettre ensemble. Vous avez trois choses à ce stade: p>

    1. une version de contraste élevée de votre image d'origine li>
    2. La différence de l'image floue et de votre original (cette couche est principalement noire). Cette couche est le masque non blindé em> li>
    3. l'original li> ol>

      L'algorithme va comme ceci: regardez un pixel du masque non blindé et découvrez sa luminosité (luminosité). Si la luminosité est de 100%, utilisez la valeur de l'image à contraste élevée pour ce pixel. S'il est 0%, utilisez la valeur de l'image d'origine pour ce pixel. Si c'est quelque part entre les deux, mélanger les valeurs de deux pixels en utilisant une certaine pondération. Éventuellement, ne modifiez que la valeur du pixel s'il change de plus d'une certaine quantité (il s'agit du curseur Seuil em> sur la plupart des dialogues USM). P> LI> ol>

      Mettez-le tous ensemble et vous avez votre image! P>

      Voici quelques pseudocodes: p>

      color[][] usm(color[][] original, int radius, int amountPercent, int threshold) {
        // copy original for our return value
        color[][] retval = copy(original);
      
        // create the blurred copy
        color[][] blurred = gaussianBlur(original, radius);
      
        // subtract blurred from original, pixel-by-pixel to make unsharp mask
        color[][] unsharpMask = difference(original, blurred);
      
        color[][] highContrast = increaseContrast(original, amountPercent);
      
        // assuming row-major ordering
        for(int row = 0; row < original.length; row++) {
          for(int col = 0; col < original[row].length; col++) {
             color origColor = original[row][col];
             color contrastColor = highContrast[row][col];
      
             color difference = contrastColor - origColor;
             float percent = luminanceAsPercent(unsharpMask[row][col]);
      
             color delta = difference * percent;
      
             if(abs(delta) > threshold)
               retval[row][col] += delta;
          }
        }
      
        return retval;
      }
      


2 commentaires

Donc, bien sûr, l'expert non graphique (moi) penserait à la longue façon de faire de cela. Il s'avère que peut-être une sorte de convolution inverse gaussienne flou fonctionnerait ( photo.net/bboard/q-and-a-fetch-msg.tcl?msg_id=000QI5 ), bien que je ne suis pas sûr que leur matrice de convolution soit identique à ma description (la mienne suit de plus près le processus de film décrit sur Wikipedia). Voir aussi: photo.net/bboard/q-and-a -fetch-msg? msg_id = 001mod


Regardez ici: Stackoverflow.com/Questtions/13296645/...



5
votes

Unsharp est généralement implémenté comme noyau de convolution qui détecte les bords. Le résultat de cette convolution est ajouté à l'image d'origine pour augmenter le contraste des bords qui ajoute l'illusion d'une "netteté" supplémentaire.

Le noyau exact utilisé varie d'un peu de personne à personne et d'application à l'application . La plupart d'entre eux ont ce format général: P>

    -1 -1 -1
g = -1  8 -1
    -1 -1 -1


0 commentaires

2
votes

Considérez le code ci-dessous, qui prend en charge une image d'entrée, img. XXX

J'espère que cela aide!

bientôt chee loong,

Université de Toronto


0 commentaires