comparación de histograma opencv

prefacio

El histograma de imagen se explica en detalle en , y la comparación de histograma de imagen es un medio para medir la similitud de dos imágenes. Para comparar dos histogramas (H1 y H2), primero tenemos que elegir una métrica (d(H1,H2)) para representar qué tan bien coinciden los dos histogramas. OpenCV proporciona 4 métricas diferentes para calcular coincidencias:
Correlación (HISTCMP_CORREL):
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
N es N es el número total de contenedores de histograma.

Chi-Cuadrado ( HISTCMP_CHISQR)
inserte la descripción de la imagen aquí
Intersección ( method=HISTCMP_INTERSECT)
inserte la descripción de la imagen aquí
Distancia Bhattacharyya ( HISTCMP_BHATTACHARYYA)
inserte la descripción de la imagen aquí

soporte de función opencv

Prototipo de función:

CV_EXPORTS_W double compareHist( InputArray H1, InputArray H2, int method );

Descripción de los parámetros:
H1: El primero en comparar el histograma.
H2: El segundo quiere un histograma, del mismo tamaño que H1.
method : el método de comparación, consulte #HistCompMethods, para los métodos de correlación e intersección, cuanto mayor sea la métrica, más precisa será la coincidencia. La distancia Square y Bhattacharyya son opuestas.

Ejemplo de código:

    cv::Mat image = cv::imread("D:\\QtProject\\Opencv_Example\\Hist\\Hist.png", cv::IMREAD_GRAYSCALE);
    if (image.empty()) {
    
    
      cout << "Cannot load image" << endl;
      return;
    }
    imshow("image",image);

    const int bins[1] = {
    
     256 };
    float hranges[2] = {
    
     0,255 };
    const float* ranges[1] = {
    
     hranges };

    Mat hist;
    // 计算直方图
    calcHist(&image, 1, 0, Mat(), hist, 1, bins, ranges);
    normalize(hist, hist, 0, 1, NORM_MINMAX, -1, Mat()); //将数据规皈依到0和1之间

    cv::Mat imageCvert;
    image.convertTo(imageCvert, -1, 1, 50);
    imshow( "imageCvert", imageCvert);
    Mat histCompare;
    calcHist(&imageCvert, 1, 0, Mat(), histCompare, 1, bins, ranges);
    normalize(histCompare, histCompare, 0, 1, NORM_MINMAX, -1, Mat()); //将数据规皈依到0和1之间


   double CORREL = compareHist( hist, histCompare, HISTCMP_CORREL );
   double CHISQR = compareHist( hist, histCompare, HISTCMP_CHISQR );
   double INTERSECT = compareHist( hist, histCompare, HISTCMP_INTERSECT );
   double BHATTACHARYYA = compareHist( hist, histCompare, HISTCMP_BHATTACHARYYA );
   cout << "HISTCMP_CORREL:" << CORREL<<endl
        <<  "HISTCMP_CHISQR:"  << CHISQR << endl
        << "HISTCMP_INTERSECT:" << INTERSECT << endl
        << "HISTCMP_BHATTACHARYYA:" << BHATTACHARYYA << endl;

Comparación de dos imágenes:
inserte la descripción de la imagen aquí
ejecutar resultados:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44901043/article/details/123497295
Recomendado
Clasificación