Comment aiguiser une image dans OpenCV?

Comment affiner une image en utilisant OpenCV ? Il y a plusieurs façons de lisser ou de flou mais aucune que je pouvais voir d'affûtage.

92
demandé sur Jav_Rock 2011-02-14 17:07:26

5 réponses

Une procédure générale est énoncée dans l'article de wikipédia sur le masquage flou: Vous utilisez un filtre de lissage gaussien et soustrayez la version lissée de l'image d'origine (de manière pondérée afin que les valeurs d'une zone constante restent constantes).

Pour obtenir une version affûtée de frame dans image: (les deux cv::Mat)

cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);

Les paramètres il y a quelque chose que vous devez ajuster pour vous-même.

Il y a aussi l'affûtage laplacien, vous devriez trouver quelque chose là-dessus lorsque vous google.

141
répondu etarion 2011-02-14 15:36:19

, Vous pouvez essayer un simple noyau, et les filter2D fonction, par exemple en Python:

kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
im = cv2.filter2D(im, -1, kernel)

Wikipedia a un bon aperçu des noyaux avec quelques autres exemples ici - https://en.wikipedia.org/wiki/Kernel_(image_processing)

En traitement d'image, un noyau, une matrice de convolution ou un masque est une petite matrice. Il est utilisé pour flou, affûtage, gaufrage, détection de bord, et plus. Ceci est accompli en faisant une convolution entre un noyau et une image.

20
répondu Brian Burns 2018-06-12 10:26:18

Vous pouvez trouver un exemple de code sur netteté de l'image en utilisant l'algorithme "masque flou" à Documentation OpenCV

Modifier les valeurs de sigma,threshold,amount vous donnera des résultats différents

// sharpen image using "unsharp mask" algorithm
Mat blurred; double sigma = 1, threshold = 5, amount = 1;
GaussianBlur(img, blurred, Size(), sigma, sigma);
Mat lowContrastMask = abs(img - blurred) < threshold;
Mat sharpened = img*(1+amount) + blurred*(-amount);
img.copyTo(sharpened, lowContrastMask);
12
répondu sturkmen 2015-11-28 12:52:28

Pour plus de clarté dans ce sujet, quelques points devraient vraiment être faits:

  1. L'affûtage des images est un problème mal posé. En d'autres termes, le flou est une opération avec perte, et revenir en arrière n'est en général pas possible.

  2. Pour affiner les images simples, vous devez en quelque sorte ajouter des contraintes (hypothèses) sur le type d'image que vous voulez, et comment il est devenu flou. C'est le domaine des statistiques d'image naturelle. Approches pour faire affûtage tenir ces statistiques explicitement ou implicitement dans leurs algorithmes (l'apprentissage profond étant les plus implicitement codés). L'approche commune de la pondération ascendante de certains niveaux d'un chien ou d'une décomposition pyramidale Laplacienne , qui est la généralisation de la réponse de Brian Burns, suppose qu'un flou gaussien a corrompu l'image, et la façon dont la pondération est faite est liée à des hypothèses sur ce qui était dans l'image pour commencer.

  3. D'autres sources d'information peuvent rendre le problème plus aiguisé bien posé. Ces sources d'information communes sont la vidéo d'un objet en mouvement ou le réglage multi-view. L'affûtage dans ce paramètre est généralement appelé super-résolution (ce qui est un très mauvais nom pour cela, mais il est resté dans les cercles académiques). Il y a eu des méthodes de super-résolution dans OpenCV depuis longtemps.... bien qu'ils ne fonctionnent généralement pas aussi bien pour de vrais problèmes, je les ai vérifiés. J'attends l'apprentissage en profondeur a produit des résultats merveilleux ici. Peut-être quelqu'un va poster des remarques sur ce qui vaut la peine là-bas.

0
répondu Stefan Karlsson 2018-09-21 11:26:33

Essayez avec ceci:

cv::bilateralFilter(img,9,75,75);

Vous trouverez peut-être plus d'informations ici

-4
répondu mch 2014-03-02 11:38:06