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.
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.
, 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.
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);
Pour plus de clarté dans ce sujet, quelques points devraient vraiment être faits:
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.
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.
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.