Est-il un moyen de détecter si une image est floue?
Je me demandais si il existe un moyen pour déterminer si une image est floue ou non en analysant les données de l'image.
Question connexe, qui a une bonne réponse, mais aussi plus impliqués question de formulation. stackoverflow.com/questions/5180327/...
Il a également beaucoup de choses pire des réponses.
Il a également beaucoup de choses pire des réponses.
OriginalL'auteur Sam | 2011-10-14
Vous devez vous connecter pour publier un commentaire.
Oui, il est. Calculer la transformée de Fourier Rapide et analyser le résultat. La transformée de Fourier vous indique quelles sont les fréquences présentes dans l'image. Si il ya une faible quantité de hautes fréquences, puis l'image est floue.
La définition des termes " bas " et "haut" est à vous.
Modifier:
Comme indiqué dans les commentaires, si vous voulez qu'un seul flotteur représentant le blurryness d'une image donnée, vous avez à travailler sur un adapté métrique.
i nik e réponse fournir une telle métrique. De convolution de l'image avec un Laplacien noyau:
Et l'utilisation d'un robuste maximum métrique sur la sortie d'un numéro que vous pouvez utiliser pour seuillage. Essayez d'éviter de lissage trop les images avant de calculer le Laplacien, parce que vous ne trouverez qu'un lissé de l'image est en effet de flou :-).
À moins que votre image est cyclique, vous aurez généralement ont des bords tranchants à l'intérieur des frontières de l'image qui conduisent à de très hautes fréquences
vous habituellement pratiquement prolonger votre image pour éviter cet effet. vous pouvez aussi utiliser de petites fenêtres pour calculer les locaux de la fft.
Un seul point qui est extrêmement important, c'est que vous devez savoir (au moins à peu près) ce que votre pré-floue image (fréquence) le contenu a été. C'est vrai que le spectre de fréquence va être celle de l'image originale fois que le filtre de flou. Ainsi, si l'image d'origine déjà eu principalement les basses fréquences, comment pouvez-vous dire si elle était floue?
Si vous prenez une photo d'un vide blanc graphique vous n'avez aucun moyen de dire si l'image est floue ou pas. Je pense que l'OP veut une absolue netteté de mesure. le preblurred image peut ne pas exister du tout. Vous avez un peu de travail à venir avec une bonne mesure, mais fft peut aider avec ce problème. Dans cette perspective, nickie la réponse est meilleure que la mienne.
OriginalL'auteur Simon Bergot
Un autre moyen très simple pour estimer la netteté d'une image est d'utiliser une transformée de Laplace (ou Journal) de filtre et choisissez simplement la valeur maximale. À l'aide d'une mesure robuste comme 99,9% quantile est probablement mieux si vous vous attendez à du bruit (c'est à dire la cueillette de la Nième de contraste le plus élevé au lieu de le contraste le plus élevé.) Si vous vous attendez à varier la luminosité de l'image, vous devez également inclure une étape de prétraitement pour normaliser la luminosité de l'image (luminosité, contraste, par exemple, égalisation d'histogramme).
J'ai mis en œuvre de Simon suggestion et celui-ci en Mathematica, et il a essayé sur quelques images de test:
Le premier test brouille les images de test à l'aide d'un filtre Gaussien avec une variation de la taille du noyau, puis calcule la FFT de l'image floue et prend la moyenne des 90% les plus hautes fréquences:
Résultat dans un logarithmique de la parcelle:
Le 5 lignes représentent les 5 images de test, l'axe X représente le filtre Gaussien de rayon. Les graphiques sont en baisse, de sorte que la FFT est une bonne mesure de la netteté.
C'est le code pour le "le plus grand Journal" estimateur flou: Il s'applique simplement un filtre de Journal et les rendements les plus brillants de pixel dans le filtre résultat:
Résultat dans un logarithmique de la parcelle:
La propagation de l'onu-les images floues est un peu mieux ici (2.5 vs 3.3), principalement parce que cette méthode utilise le plus fort contraste dans l'image, tandis que la FFT est essentiellement une moyenne sur l'ensemble de l'image. Les fonctions sont également en baisse plus rapide, de sorte qu'il peut être plus facile de définir un "flou" seuil.
Que faire si je suis à la mesure de la section locale de flou. À savoir, une Photo a des domaines où il est flou et où il est de forte. Je veux avoir une carte qui estimer le niveau de flou par pixel.
Je ne sais pas si c'est encore possible. Par exemple, regardez l'image Lena: Il y a de nombreux domaines où il n'y a pas de contraste (par exemple, Lena de la peau), bien que la zone est mise en avant. Je ne peux pas penser à une façon de dire si une telle douceur de la zone est "floue", ou pour le distinguer de l'extérieur de leur zone de concentration. Vous devriez demander à ce qu'une autre question (peut-être sur DSP.SE). Peut-être que quelqu'un a de meilleures idées.
Est-il adapté pour le flou de mouvement? ou seulement pour le flou comme gaussien?
Bien sûr! pastebin.com/VuYshqhk
OriginalL'auteur Niki
Pendant un certain travail avec un auto-focus de la lentille, je suis tombé sur ce très utile de définir des algorithmes pour la détection de l'image se concentrer. Il est implémenté en MATLAB, mais la plupart des fonctions sont assez faciles à port OpenCV avec filter2D.
C'est essentiellement une enquête sur la mise en œuvre de plusieurs algorithmes de mesure. Si vous voulez lire les articles originaux, les références aux auteurs des algorithmes sont prévues dans le code. La 2012 de papier par Pertuz, et al. L'analyse des focus mesure opérateurs pour la forme de focus (SFF) donne une grande revue de l'ensemble de ces mesures ainsi que de leur performance (à la fois en termes de vitesse et de précision appliquée à la MFS).
EDIT: Ajout de code MATLAB juste au cas où le lien meurt.
Quelques exemples de OpenCV versions:
Aucune garantie sur si oui ou non ces mesures sont le meilleur choix pour votre problème, mais si vous traquent les documents associés à ces mesures, ils peuvent vous donner plus de perspicacité. J'espère que vous trouverez le code utile! Je sais que j'ai fait.
J'utilise normalement 3, 5, ou 7 en fonction de la résolution de l'image. Si vous trouvez que vous avez besoin pour aller au-delà, vous pouvez regarder la sous-échantillonnage de l'image.
OriginalL'auteur mevatron
Construction de la réponse de Nike. Son simple à mettre en œuvre le laplacien en fonction de la méthode avec opencv:
Sera de retour d'un court indiquant le maximum de netteté détecté, qui, sur base de mes tests sur le monde réel des échantillons, est un assez bon indicateur de savoir si une caméra est activée ou pas. Il n'est pas surprenant, les valeurs normales sont de scène, mais dépend du beaucoup moins que la méthode FFT qui a pour hauteur d'un taux de faux positifs pour être utile dans mon application.
Aussi essayé ta suggestion, mais les chiffres que je reçois sont un peu aléatoires. Si je commence une nouvelle question à l'égard de cette mise en oeuvre particulière, pourriez-vous jeter un oeil?\
Le droit de seuil est dépendante de la scène. Dans mon application (CCTV), je suis en utilisant un seuil par défaut de 300. Pour les caméras où la basse quelqu'un de soutien va changer la valeur configurée pour que l'appareil photo en particulier.
pourquoi "maxLap = -32767;" ?
Nous sommes à la recherche pour le contraste le plus élevé et puisque nous travaillons avec signé short de -32767 est la plus petite valeur possible. Sa fait 2.5 ans que j'ai écrit ce code, mais autant que je me souvienne, j'ai eu des problèmes à l'aide de 16U.
OriginalL'auteur Yaur
Je suis venu avec une solution complètement différente.
J'avais besoin d'analyser la vidéo des images fixes à trouver la plus forte dans chaque (X) cadres. De cette façon, je détecter le flou de mouvement et/ou des images floues.
J'ai fini par utiliser Savant détection de Bord et j'ai eu de TRÈS TRÈS bons résultats avec presque tous les types de vidéo (avec i nik e de la méthode, j'ai eu des problèmes avec numériser des vidéos VHS et lourd vidéos entrelacées).
J'ai optimisé la performance par la définition d'une région d'intérêt (ROI) dans l'image d'origine.
À L'Aide De EmguCV :
OriginalL'auteur Goldorak84
Grâce i nik e pour ce grand Laplace suggestion.
OpenCV docs m'a orienté dans la même direction:
à l'aide de python, cv2 (opencv 2.4.10), et numpy...
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))
résultat est compris entre 0 et 255. J'ai trouvé quelque chose de plus 200ish est très au point, et par 100, c'est nettement floue. max ne reçoit jamais vraiment beaucoup de moins de 20 ans, même si c'est complètement flou.
D'accord avec @WindWider. Un exemple d'image en cas d'échec cette image je pense que la raison en est que, même si l'image est instable, le contraste de l'image et correspondant différences d'intensité entre les pixels est important , en raison de laquelle Laplacien Valeurs sont relativement importantes. S'il vous plaît corrigez-moi si je me trompe.
cc WindRider - idem - des idées sur la façon de résoudre ce problème??
OriginalL'auteur ggez44
D'une façon qui, je suis actuellement à l'aide de mesures de la propagation des contours dans l'image. Look pour cet article:
Il est généralement derrière un paywall mais j'ai vu des exemplaires gratuits autour. Fondamentalement, ils localiser les bords verticaux dans une image, puis de mesurer la largeur de ces bords sont. La moyenne de la largeur donne au final le flou de l'estimation du résultat de l'image. Larges bords correspondent à des images floues, et vice versa.
Ce problème appartient au domaine de la sans image de référence de la qualité de l'estimation. Si vous regardez sur Google Scholar, vous obtiendrez beaucoup de références utiles.
MODIFIER
Voici une parcelle de l'effet de flou des estimations obtenues pour les 5 images dans i nik e post. Des valeurs plus élevées correspondent à plus de flou. J'ai utilisé une taille fixe 11x11 filtre Gaussien et variée, la déviation standard (à l'aide d'imagemagick
convert
de commande pour obtenir les images floues).Si vous comparez des images de différentes tailles, n'oubliez pas de normaliser par la largeur de l'image, depuis les grandes images sont plus larges bords.
Enfin, un problème important est la distinction entre le flou artistique et un flou (causée par l'accent manquer, la compression, la vitesse relative de l'objet à la caméra), mais qui est au-delà des approches simples comme celui-ci. Pour un exemple de flou artistique, jetez un oeil à l'image Lenna: Lenna du reflet dans le miroir est floue, mais son visage est parfaitement mise au point. Cela contribue à une plus grande flou de l'estimation pour la Lenna image.
OriginalL'auteur mpenkov
Les réponses ci-dessus élucidé beaucoup de choses, mais je pense qu'il est utile de faire une distinction conceptuelle.
Que si vous prenez un parfaitement-mise au point l'image d'une image floue?
Le flou de détection problème est bien posé lorsque vous avez un référence. Si vous avez besoin pour concevoir, par exemple, un auto-focus du système, de la comparaison d'une séquence d'images prises avec différents degrés de flou, ou de lissage, et vous essayez de trouver le point de minimum de flou à l'intérieur de cet ensemble. J'ai d'autres mots, vous avez besoin de croiser les différentes images à l'aide de l'une des techniques illustré ci-dessus (en gros--avec différents niveaux de raffinement dans l'approche--la recherche de l'image la plus haute fréquence de contenu).
OriginalL'auteur Emerald Weapon
J'ai essayé solution basée sur le filtre Laplacien de cette post. Il ne m'a pas aidé. Donc, j'ai essayé la solution de cette post et c'est bon pour mon cas (mais lent):
Moins brouillé l'image du maximum de
sum
valeur!Vous pouvez également régler la vitesse et la précision en modifiant étape, par exemple
cette partie
vous pouvez le remplacer avec celui-ci
OriginalL'auteur Exterminator13
Code Matlab de deux méthodes qui ont été publiées dans hautement considéré revues (IEEE Transactions sur le Traitement de l'Image) sont disponibles ici: https://ivulab.asu.edu/software
vérifier la CPBDM et JNBM algorithmes. Si vous examinez le code c'est pas très dur d'être porté, et d'ailleurs il est basé sur le Marzialiano la méthode de base de la fonctionnalité.
OriginalL'auteur Marco
j'ai mis en œuvre l'utilisation de la fft de matlab et de vérifier l'histogramme de la fft de calcul de la moyenne et de mst, mais aussi l'ajustement de la fonction peut être fait
OriginalL'auteur user3452134
C'est ce que je fais dans Opencv pour détecter l'accent de la qualité dans une région:
OriginalL'auteur Nadav B