Как я могу сравнить и определить, совпадают ли две гистограммы? - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь сравнить и проверить, соответствуют ли два изображения друг другу.Я не смог найти подходящих руководств по сравнению с OpenCV Java в Android Studio.Итак, я нашел несколько шагов и начал вычислять гистограммы, чтобы я мог затем сравнить гистограммы двух изображений и посмотреть, совпадают ли они.

Я кодировал приведенный ниже способ вычисления гистограммы изатем сравните его.

Mat matB2 = new Mat(sourceSize, sourceMat.type());
                Mat matG2 = new Mat(sourceSize, sourceMat.type());
                Mat matR2 = new Mat(sourceSize, sourceMat.type());

                    Imgproc.calcHist(channels2, allChannel2[0], new Mat(),  matB2, hisSize2, histRange2);
                    Imgproc.calcHist(channels2, allChannel2[1], new Mat(), matG2, hisSize2, histRange2);
                    Imgproc.calcHist(channels2, allChannel2[2], new Mat(), matR2, hisSize2, histRange2);

                    Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show();

                    int graphHeight2 = 300;
                    int graphWidth2 = 200;
                    int binWidth2 = 3;

                    Mat graphMat2 = new Mat(graphHeight2, graphWidth2, CvType.CV_8UC3, new Scalar(0, 0, 0));

                    //Normalize channel
                    Core.normalize(matB2, matB2, graphMat2.height(), 0, Core.NORM_INF);
                    Core.normalize(matG2, matG2, graphMat2.height(), 0, Core.NORM_INF);
                    Core.normalize(matR2, matR2, graphMat2.height(), 0, Core.NORM_INF);



  //Comparing histograms
                    int compareMethod = 1;
                    double comparisonValueB = Imgproc.compareHist(matB,matB2, Imgproc.CV_COMP_CORREL);
                    double comparisonValueG = Imgproc.compareHist(matG,matG2,Imgproc.CV_COMP_CORREL);
                    double comparisonValueR = Imgproc.compareHist(matR,matR2,Imgproc.CV_COMP_CORREL);

                    Toast.makeText(MainActivity.this, "comparisonValueB::"+comparisonValueB, Toast.LENGTH_SHORT).show();
                    Toast.makeText(MainActivity.this, "comparisonValueG::"+comparisonValueG, Toast.LENGTH_SHORT).show();
                    Toast.makeText(MainActivity.this, "comparisonValueR::"+comparisonValueR, Toast.LENGTH_SHORT).show();

Однако результаты, которые я получил от трех добавленных тостов со значениями сравнения, следующие:

  • ** сравнениеValueB: ** 1984.5519 **сравнениеValueG: ** 2159,2307 ** сравнениеValueR: ** 3420,9038

Я не понимаю, что означают эти значения.Может кто-нибудь сообщить мне, что означают эти значения и как я могу узнать, похожи изображения или нет.Также не предполагается, что значения находятся между 0 и 1, где 1 - самое высокое совпадение, а ноль - самое низкое?

Я очень новичок в OpenCV, поэтому, пожалуйста, помогите мне с этим.Если я сравниваю неправильно, пожалуйста, дайте мне знать правильный метод тоже.

1 Ответ

0 голосов
/ 02 июня 2019

Сначала ваш вопрос - что означает число?Сначала вы найдете гистограмму.тогда нормализуй это.Затем вы сравниваете разницу двух нормализованных гистограмм.Смотрите изображение ниже.без нормализации это означает общее количество пикселей на уровне интенсивности.При нормализации это вероятность нахождения определенного пикселя на одном уровне цвета.Итак, что вы делаете, это сравниваете общую разницу двух PDF.

enter image description here

Секунда Если вам нужно сравнить и проверить, соответствуют ли два изображения друг другу.тогда сравнение гистограммы может быть худшим вариантом. См. пример ниже.Ваша идея состоит в том, что 2 изображения одинаковы, если их гистограмма одинакова между А и В. Но я могу показать вам, что теперь она такая же, как видно из нижней части.В нижней части 2 гистограммы одинаковы, но изображение представляет разные вещи.

enter image description here

Самый простой способ проверить, совпадают ли два изображения, - сопоставить шаблон.Вы можете найти тот же код в ссылке ниже

https://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

> void matchTemplate(InputArray image, InputArray templ, OutputArray
> result, int method)

enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...