Comment obtenir un effet de couleur magique comme Cam Scanner en utilisant OpenCV

C'est l'image originale.

Image originale

  • Dans Android, chaque écran devrait-il être sa propre activité ou sa mise en page?
  • Comment afficher une vue vide avec RecyclerView?
  • WindowBackground dans Android 6 (Marshmallow)
  • Comment ouvrir / fermer SQLite db dans Android correctement
  • Comment faire pivoter TextView 90 degrés et afficher
  • Rénover "IllegalStateException: déjà exécuté"
  • Effet de couleur magique Cam Scanner. Effet du scanner à cames

    Mon filtre sur l'image.

    Mon filtre

    Je change le contraste de l'image.

    dst.convertTo(dst, -1, 2, 0); 

    Ensuite, utilisez un flou gaussien pour le lissage.

     cv::GaussianBlur(dst,result,cv::Size(0,0),3); cv::addWeighted(dst, 1.5, result, -0.5, 0, result); 

    Que dois-je faire pour atteindre ce genre d'effet sur mon image?

    METTRE À JOUR

    Après l'histogramme Equilisation –

     vector<Mat> channels; Mat img_hist_equalized; cvtColor(dst, img_hist_equalized, CV_BGR2YCrCb); split(img_hist_equalized,channels); equalizeHist(channels[0], channels[0]); merge(channels,img_hist_equalized); cvtColor(img_hist_equalized, img_hist_equalized, CV_YCrCb2BGR); 

    Equilisation d'histogramme

  • Mode d'analyse XML (org.w3c.Document) sur Android
  • Android: EditText.setInputType () comment configurer le courrier électronique mais pas la suggestion automatique
  • Intraweb HTML5 application, git et base de données - se fondent-ils?
  • L'activité actuelle de l'application Android porte sur le problème avant
  • Gradle pour Android, AAR et dépendances conditionnelles
  • Google Maps v2 Dans le fragment encaissé lorsqu'il est cliqué deux fois
  • 3 Solutions collect form web for “Comment obtenir un effet de couleur magique comme Cam Scanner en utilisant OpenCV”

    L'application camscanner peut utiliser un algorithme complexe pour gérer différents cas de foudre, etc. Mais j'essaierai de couvrir une approche de base de ce problème, l'idée de base ici est la binarisation de l'image d'entrée donnée, ou plus précisément on peut dire Theresholding a Image donnée, si vous regardez la documentation OpenCV, il y a beaucoup de références au seuillage d'une image donnée. Commençons par la documentation .

    • Seuil global : dans cette approche, nous supposons que la valeur d'intensité du premier plan est toujours inférieure à une certaine valeur. Dans le contexte des feuilles imprimées, nous supposons que la couleur de l'encre est toujours noire et la couleur du papier est uniforme et l'intensité est supérieure à l'intensité de Couleur d'encre, nous supposons en toute sécurité un certain seuil (disons 40), (max. 255) et le seuil de l'image d'entrée comme suit:

       ret, thresh1 = cv2.threshold(img, 100, 255, cv2.THRESH_BINARY) 

      Entrez la description de l'image ici

       ret, thresh1 = cv2.threshold(img, 130, 255, cv2.THRESH_BINARY) 

      Entrez la description de l'image ici

      Il existe de nombreux inconvénients à cette méthode. Tout d'abord, il n'est PAS indépendant de la variance de l'intensité, il y a donc beaucoup moins de chance que vous puissiez estimer avec précision une valeur de seuil qui segment le texte de l'image donnée. Elle a des applications très limitées, peut être Appliqué uniquement dans le cas où le document d'arrière-plan est exactement blanc avec une variation d'intensité minimale, ce processus ne peut donc pas être utilisé pour les images du monde réel .

    • Seuil adaptatif : cette méthode couvre le problème de variation d'intensité dans l'image donnée, ici le seuillage est effectué sur les valeurs des pixels voisins. Ainsi, les transitions d'une intensité inférieure à supérieure et vice versa sont capturées avec succès avec cette méthode comme suit:

       thresh = cv2.adaptiveThreshold(original_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) 

      Entrez la description de l'image ici

      Autres travaux : Vous pouvez travailler sur diverses techniques de débruitage de l'image binaire, supprimer les points, ou jeter un coup d'oeil sur l'élimination du bruit de poivre et de sel de l'image.

    • Binarisation d'Otu : C'est encore une autre belle approche qui calcule intelligemment la valeur de seuil, entre les maximas. Cela peut être très intéressant dans certains cas, mais il semble échouer dans votre cas.

       ret2,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

      Entrez la description de l'image ici

    Il s'agit essentiellement du même seuil global. Mais maintenant, le seuil est calculé automatiquement de telle sorte que le seuil se situe entre 2 pics et donc la segmentation de l'encre du papier.

    Méthode recommandée: je suppose que la meilleure approche pour commencer est le seuil adaptatif , vous pouvez essayer d'autres techniques de prétraitement telles que l' affinement de l'image , l' égalisation des histogrammes , etc. et analyser comment il crée une sortie plus réaliste, vous pouvez également essayer de publier Traitement tel que le débruitage de l'image , les opérations morphologiques

    J'ai essayé de dissimuler l'image et l'ai trouvé plus efficace à d'autres approches,

     denoised = cv2.fastNlMeansDenoising(thresh, 11, 31, 9) # you may experiment with the constants here 

    Entrez la description de l'image ici

    Mais je vous invite à essayer différentes combinaisons des approches ci-dessus pour voir lequel fonctionne pour tous les cas.

    J'ai écrit un code qui fait ce genre de chose, mais pas avec OpenCV.

    En règle générale, j'analyserais un histogramme, j'estimerai ce que «blanc» et «noir» repose sur l'histogramme, puis calcule les valeurs de l'image afin que le noir soit mis à l'échelle sous 0 et que le blanc soit au-dessus de 1 (ou 255 selon votre représentation) , Finalement en serrant les valeurs de couleur.

    Cependant, avec OpenCV, il se peut qu'il y ait un moyen plus simple. Essayez d'utiliser l'égalisation d'histogramme sur votre page recadrée avant d'appliquer un filtre de contraste – qui devrait étaler les valeurs des pixels de manière plus cohérente afin que le réglage du contraste fonctionne de manière plus fiable dans plus de situations. Vous pouvez essayer d'utiliser l'égalisation d'histogramme localisée pour aider à atténuer les gradients sur l'image recadrée en raison de l'éclairage, mais cela peut causer des problèmes avec les zones vides de la page.

    Je me rends compte que je suis un peu en retard au jeu, mais j'ai trouvé cette solution géniale et simple:

     src.convertTo(dst, -1, 1.9, -80); 

    Src et dst peuvent être la même image si vous travaillez dans une pipeline de traitement.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.