как сравнить два изображения, в которых слова разные? - PullRequest
0 голосов
/ 06 июня 2019

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

Я использовал opencvsharp, https://github.com/shimat/opencvsharp, и гистограмму для сравнения снимков экрана, но результат показывает, что сходство довольно высокое, даже если разница составляет 3 слова.

код гистограммы:

double compareFacesByHist(Mat img, Mat orgImg)
    {
        Mat tmpImg = new Mat();
        if (img.Size().Equals(orgImg.Size()) == false)
        {
            Cv2.Resize(img, tmpImg, new OpenCvSharp.Size(orgImg.Cols, orgImg.Rows));
        }
        else
        {
            tmpImg = img;
        }


        tmpImg = tmpImg.CvtColor(ColorConversionCodes.BGR2HSV);
        orgImg = orgImg.CvtColor(ColorConversionCodes.BGR2HSV);


        int hBins = 256, sBins = 256;
        int[] histSize = { hBins, sBins };

        Rangef hRanges = new Rangef(0, 180);

        Rangef sRanges = new Rangef(0, 255);

        Rangef[] ranges = { hRanges, sRanges };
        int[] channels = { 0, 1 };
        Mat hist1 = new Mat(), hist2 = new Mat();
        Cv2.CalcHist(new Mat[] { tmpImg }, channels, new Mat(), hist1, 2, histSize, ranges, true, false);
        Cv2.Normalize(hist1, hist1, 0, 1, NormTypes.MinMax, -1, new Mat());
        Cv2.CalcHist(new Mat[] { orgImg }, channels, new Mat(), hist2, 2, histSize, ranges, true, false);
        Cv2.Normalize(hist2, hist2, 0, 1, NormTypes.MinMax, -1, new Mat());

        double similarityValue = Cv2.CompareHist(hist1, hist2, HistCompMethods.Correl);// CV_COMP_CORREL);
        return similarityValue;
    }

некоторый результат: +0,999999999797675 +0,999999648350145

Полагаю, гистограмма использует только цветовую информацию для сравнения двух изображений, трудно отразить изменение слов. Я хотел бы узнать лучший способ сравнить такие изображения. спасибо.

Ответы [ 2 ]

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

Я использовал способ @ nathancy, ssim, для сравнения изображений, результат намного лучше, чем гистограмма. Снимок экрана: блокнот, чтобы получить изображения для сравнения, и блокнот содержит редактируемый документ, который включает в себя несколько строк предложений.

1, точно такие же два снимка экрана: 0.999999295236082

2, добавить в документы несколько слов: 0.996387690483554

3, удаление только что добавленных слов: 0.999760811255743

Я все еще использую opencvsharp, а метод ssim переведен с версии opencv для c ++.

    Scalar getMSSIM(Mat i1, Mat i2)
    {
        const double C1 = 6.5025, C2 = 58.5225;
        /***************************** INITS **********************************/
        MatType d = MatType.CV_32F;

        Mat I1 = new Mat(), I2 = new Mat();
        i1.ConvertTo(I1, d);           // cannot calculate on one byte large values
        i2.ConvertTo(I2, d);

        Mat I2_2 = I2.Mul(I2);        // I2^2
        Mat I1_2 = I1.Mul(I1);        // I1^2
        Mat I1_I2 = I1.Mul(I2);        // I1 * I2

        /***********************PRELIMINARY COMPUTING ******************************/

        Mat mu1 = new Mat(), mu2 = new Mat();   //
        Cv2.GaussianBlur(I1, mu1, new OpenCvSharp.Size(11, 11), 1.5);
        Cv2.GaussianBlur(I2, mu2, new OpenCvSharp.Size(11, 11), 1.5);

        Mat mu1_2 = mu1.Mul(mu1);
        Mat mu2_2 = mu2.Mul(mu2);
        Mat mu1_mu2 = mu1.Mul(mu2);

        Mat sigma1_2 = new Mat(), sigma2_2 = new Mat(), sigma12 = new Mat();

        Cv2.GaussianBlur(I1_2, sigma1_2, new OpenCvSharp.Size(11, 11), 1.5);
        sigma1_2 -= mu1_2;

        Cv2.GaussianBlur(I2_2, sigma2_2, new OpenCvSharp.Size(11, 11), 1.5);
        sigma2_2 -= mu2_2;

        Cv2.GaussianBlur(I1_I2, sigma12, new OpenCvSharp.Size(11, 11), 1.5);
        sigma12 -= mu1_mu2;

        ///////////////////////////////// FORMULA ////////////////////////////////
        Mat t1, t2, t3;

        t1 = 2 * mu1_mu2 + C1;
        t2 = 2 * sigma12 + C2;
        t3 = t1.Mul(t2);              // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))

        t1 = mu1_2 + mu2_2 + C1;
        t2 = sigma1_2 + sigma2_2 + C2;
        t1 = t1.Mul(t2);               // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))

        Mat ssim_map = new Mat();
        Cv2.Divide(t3, t1, ssim_map);      // ssim_map =  t3./t1;


        Scalar mssim = Cv2.Mean(ssim_map);// mssim = average of ssim map


        return mssim;
    }

Однако я хотел бы получить разностное изображение, чтобы я мог на него взглянуть. и я мог бы проверить больше ситуации, чтобы проверить ссим. спасибо

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

Возьмите пиксельную разницу двух изображений и выполните суммирование (по сути, средняя абсолютная ошибка).
Если полученное значение очень близко к 0, ничего не изменилось, в противном случае есть изменение.

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