PS: Cet article utilise deux petits cas pour démontrer l'application des opérations morphologiques dans le traitement d'image.
Extraire les lignes horizontales et droites de l'eau dans une image
Présentation de l'AIP
Segmentation de seuil adaptative
void adaptiveThreshold(InputArray src, OutputArray dst,
double maxValue, int adaptiveMethod,
int thresholdType, int bolckSize, double C)
Paramètre 1: InputArray de type src, image d'entrée, remplir un canal unique, un type à virgule flottante 8 bits Mat.
Paramètre 2: le résultat de l'opération de fonction est stocké ici. Il s'agit de l'image de sortie (de même taille et type que l'image d'entrée).
Paramètre 3: préréglez la valeur maximale qui satisfait à la condition, et l'image normale est 255.
Paramètre 4: spécifiez l'algorithme de seuil adaptatif. Vous pouvez choisir ADAPTIVE_THRESH_MEAN_C ou ADAPTIVE_THRESH_GAUSSIAN_C.
Paramètre 5: spécifiez le type de seuil. Vous pouvez choisir THRESH_BINARY ou THRESH_BINARY_INV. (C'est-à-dire, seuil binaire ou seuil binaire inverse).
Paramètre 6: indique la taille du bloc de voisinage, utilisé pour calculer le seuil de zone, et un nombre impair est sélectionné.
Paramètre 7: Le paramètre C représente un paramètre lié à l'algorithme, c'est une constante extraite de la moyenne ou moyenne pondérée, et il peut s'agir d'un nombre négatif.
ADAPTIVE_THRESH_MEAN_C est la valeur moyenne du bloc de voisinage local. L'algorithme trouve d'abord la valeur moyenne dans le bloc, puis soustrait la constante C.
ADAPTIVE_THRESH_GAUSSIAN_C est la somme pondérée gaussienne du bloc de voisinage local. L'algorithme consiste à pondérer les pixels autour de (x, y) dans la zone selon la fonction gaussienne en fonction de leur distance par rapport au point central, puis à soustraire la constante C.
Processus et idées
- Commencez par convertir l'image en niveaux de gris
- Utilisez la segmentation de seuil adaptative pour traiter l'image en deux images (remarque: lorsque le premier plan est plus sombre que l'arrière-plan, l'opération fermée doit être utilisée pour le traitement du premier plan; lorsque le premier plan est plus clair que l'arrière-plan, l'opération d'ouverture doit être utilisée pour le traitement du premier plan);
- Le noyau de calcul de conception est utilisé pour extraire les lignes connectées horizontales et verticales:
- Si vous extrayez des lignes horizontales et horizontales, la forme du noyau doit être Taille (5,1); si vous extrayez des lignes verticales, la forme du noyau doit être Taille (1,5). En bref, dans la direction à extraire, le noyau doit être plus gros que l'autre direction.
- Dans la direction d'extraction, plus l'envergure du noyau est grande, plus le degré d'extraction est élevé, c'est-à-dire plus le degré de connectivité dans cette direction doit être extrait.
- Dans le sens de non-extraction, réglez-le sur "1" pour vous assurer que la connectivité dans l'autre sens est bloquée contre les interférences dans le sens d'extraction.
Code et pratique
#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
//src = imread("src.jpg");
Mat src = imread("1.PNG");
if (!src.data)
{
cout << "cannot open image" << endl;
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image",src);
Mat gray;
cvtColor(src,gray ,COLOR_BGR2GRAY);
imshow("gray", gray);
adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
imshow("bineray", gray);
Mat Hline = getStructuringElement(MORPH_RECT, Size(1, 5), Point(-1, -1));
Mat Vline = getStructuringElement(MORPH_RECT, Size(5, 1), Point(-1, -1));
Mat H_res, V_res;
morphologyEx(gray,H_res,MORPH_CLOSE,Hline);
morphologyEx(gray,V_res,MORPH_CLOSE,Vline);
imshow("H-res", H_res);
imshow("V-res", V_res);
waitKey(0);
return 0;
}
Supprimer les interférences d'arrière-plan dans l'image captcha
Processus et idées (reportez-vous à l'exemple ci-dessus)
- Commencez par convertir l'image en niveaux de gris
- Utilisez la segmentation de seuil adaptative pour traiter l'image en deux images (remarque: lorsque le premier plan est plus sombre que l'arrière-plan, l'opération fermée doit être utilisée pour le traitement du premier plan; lorsque le premier plan est plus clair que l'arrière-plan, l'opération d'ouverture doit être utilisée pour le traitement du premier plan);
- Ajustez la taille du cœur de calcul en fonction de la taille du bruit, afin qu'il puisse filtrer les interférences de fond, tout en préservant la connectivité des caractères. En général, le rapport hauteur / largeur de la taille de coeur est le même que le rapport hauteur / largeur de l'image de code de vérification. Sinon, il doit être ajusté en fonction de la situation réelle pour s'assurer que le cœur de calcul est aussi grand que possible tout en conservant la connectivité des caractères, et plus le bruit est important, plus le filtrage est fort.
Code et pratique
#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{
Mat src = imread("chars.png");
if (!src.data)
{
cout << "cannot open image" << endl;
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image",src);
Mat gray;
cvtColor(src,gray ,COLOR_BGR2GRAY);
imshow("gray", gray);
adaptiveThreshold(gray, gray, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 10);
imshow("bineray", gray);
Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 5), Point(-1, -1));
//改变核在总想和横向的范围,来保证字符的连通性
Mat Result;
morphologyEx(gray,Result,MORPH_CLOSE,Kernel);
imshow("Result", Result);
waitKey(0);
return 0;
}