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. P>
5 Réponses :
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
La clé est l'idée de fréquence spatiale em>. Un filtre gaussien ne passe que les basses fréquences spatiales em>, donc si vous faites quelque chose comme: p>
2 * (image d'origine) - (image filtrée gaussienne) p>
alors c'est l'effet dans le domaine de fréquence spacial est: p>
(2 * toutes les fréquences) - (basses fréquences) = (2 * hautes fréquences) + (1 * basses fréquences). P>
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. . p>
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.
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:
finalement tout mettre ensemble. Vous avez trois choses à ce stade: p>
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;
}
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/...
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
Considérez le code ci-dessous, qui prend en charge une image d'entrée, img. J'espère que cela aide! P> bientôt chee loong, p> Université de Toronto P> P>
Est-ce que quelqu'un a réussi à reproduire le masque ingrat de Photoshop?