Opencv 图像的误差水平分析

Opencv 图像的误差水平分析,opencv,image-processing,Opencv,Image Processing,如何计算图像的ELA?我想得到类似的ELA图像使用opencv 根据本教程,我以95%的jpeg图像质量重新保存图像,并使用absDiff方法计算源图像和重新保存图像之间的差异,但我得到的只是零差异 关于如何计算两幅图像之间的差异以获得与本教程中的示例图像一样的错误级别,有什么帮助吗?获得类似结果的关键是使用可变的压缩率值和比例因子,以使数据更容易可视化 下面是一个示例:我们将输入图像保留在左侧,并将经过一些参数调整后的处理图像保留在右侧: 正如预期的那样,带有圣诞帽的区域呈现出与图像其余部

如何计算图像的ELA?我想得到类似的ELA图像使用opencv

根据本教程,我以95%的jpeg图像质量重新保存图像,并使用absDiff方法计算源图像和重新保存图像之间的差异,但我得到的只是零差异


关于如何计算两幅图像之间的差异以获得与本教程中的示例图像一样的错误级别,有什么帮助吗?

获得类似结果的关键是使用可变的压缩率值和比例因子,以使数据更容易可视化

下面是一个示例:我们将输入图像保留在左侧,并将经过一些参数调整后的处理图像保留在右侧:

正如预期的那样,带有圣诞帽的区域呈现出与图像其余部分不同的压缩率。这一结果与FotoForensics的结果非常相似:

通过对这段代码进行一些调整,您可以获得更接近的结果。此项目的源代码可以找到:

main.cpp:

下面是一些用于构建此mash-up的很好的参考:


你应该点击Eliezer答案旁边的复选框,选择它作为正式的问题解决程序。是否已经编译了此代码的windows可执行文件?抱歉,我对编译东西有点业余,但我喜欢显示的结果。我希望有一个可执行文件,就像前一个家伙一样
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <vector> 

// Control
int scale = 15,
    quality = 75;

// Image containers
cv::Mat input_image,
    compressed_image;

void processImage(int, void*)
{
   // Setting up parameters and JPEG compression
   std::vector<int> parameters;
   parameters.push_back(CV_IMWRITE_JPEG_QUALITY);
   parameters.push_back(quality);
   cv::imwrite("temp.jpg", input_image, parameters);

   // Reading temp image from the disk
   compressed_image = cv::imread("temp.jpg");

   if (compressed_image.empty())
   {
      std::cout << "> Error loading temp image" << std::endl;
      exit(EXIT_FAILURE);
   }

   cv::Mat output_image = cv::Mat::zeros(input_image.size(), CV_8UC3);

   // Compare values through matrices
   for (int row = 0; row < input_image.rows; ++row)
   {
    const uchar* ptr_input = input_image.ptr<uchar>(row);
    const uchar* ptr_compressed = compressed_image.ptr<uchar>(row);
    uchar* ptr_out = output_image.ptr<uchar>(row);

        for (int column = 0; column < input_image.cols; column++)
        {
            // Calc abs diff for each color channel multiplying by a scale factor
            ptr_out[0] = abs(ptr_input[0] - ptr_compressed[0]) * scale;
            ptr_out[1] = abs(ptr_input[1] - ptr_compressed[1]) * scale;
            ptr_out[2] = abs(ptr_input[2] - ptr_compressed[2]) * scale;

            ptr_input += 3;
            ptr_compressed += 3;
            ptr_out += 3;
        }
    }

    // Shows processed image
    cv::imshow("Error Level Analysis", output_image);
} 

int main (int argc, char* argv[])
{
   // Verifica se o número de parâmetros necessário foi informado
   if (argc < 2)
   {
     std::cout << "> You need to provide an image as parameter" << std::endl;
     return EXIT_FAILURE;
   }

   // Read the image
   input_image = cv::imread(argv[1]);

   // Check image load
   if (input_image.empty())
   {
      std::cout << "> Error loading input image" << std::endl;
      return EXIT_FAILURE;
   }

   // Set up window and trackbar
   cv::namedWindow("Error Level Analysis", CV_WINDOW_AUTOSIZE);
   cv::imshow("Error Level Analysis", input_image);
   cv::createTrackbar("Scale", "Error Level Analysis", &scale, 100, processImage);
   cv::createTrackbar("Quality", "Error Level Analysis", &quality, 100, processImage);

   // Press 'q' to quit
   while (char(cv::waitKey(0)) != 'q') {};

   return EXIT_SUCCESS;
}