当前位置:   article > 正文

【opencv】示例-ela.cpp JPEG图像的错误等级分析(ELA) 通过分析图像压缩后的差异来检测图像是否被篡改过...

错误级别分析ela

a1cc30729ad98f63cc30916e4228049a.jpeg

ela_modified.jpg

8b25165d04578d219e4096b8f3c93775.png

原始ela_modified压缩后再解压得到compressed_img 

71f9dfdab762b3fb56d44efd9dd01a3d.png

差异图像Ela

这段代码的功能是实现JPEG图像的错误等级分析(ELA),通过分析图像压缩后的差异来检测图像是否被篡改过。程序会首先读取一张图片,然后对其应用质量压缩,并比较原始图像与压缩后图像的差异。通过可视化这些差异,可以辅助检测图像是否被修改过。此外,程序包含两个滑动条,允许用户交互性地调整用于显示的缩放比例和压缩质量。

  1. /**
  2. @file ela.cpp
  3. @author Alessandro de Oliveira Faria (A.K.A. CABELO)
  4. @brief 错误等级分析(ELA)技术,可以识别出图像中不同压缩级别的区域。对于JPEG图片,整张图片应当大致在相同的水平。如果图片的某个部分与众不同,表明很可能进行了数字修改。这个例子可以通过压缩错误分析,直观地查看JPG图片的修改情况。有疑问或建议请通过邮件联系Alessandro de Oliveira Faria cabelo[at]opensuse[dot]org或OpenCV团队。
  5. @date 2018年6月24日
  6. */
  7. #include <opencv2/highgui.hpp>
  8. #include <iostream>
  9. using namespace cv;
  10. int scale_value = 7; // 初始化缩放值为7
  11. int quality = 95; // 初始化质量为95
  12. Mat image; // 定义原始图像的矩阵
  13. Mat compressed_img; // 定义压缩后的图像矩阵
  14. const char* decodedwin = "the recompressed image"; // 压缩图像窗口标题
  15. const char* diffwin = "scaled difference between the original and recompressed images"; // 差异图像窗口标题
  16. // 处理图像并显示
  17. static void processImage(int , void*)
  18. {
  19. Mat Ela; // 定义ELA处理结果矩阵
  20. // JPEG压缩步骤
  21. std::vector<int> compressing_factor; // 定义压缩因子
  22. std::vector<uchar> buf; // 定义压缩缓冲区
  23. compressing_factor.push_back(IMWRITE_JPEG_QUALITY); // 添加JPEG质量压缩参数
  24. compressing_factor.push_back(quality); // 添加当前质量值
  25. imencode(".jpg", image, buf, compressing_factor); // 压缩图像
  26. compressed_img = imdecode(buf, 1); // 解压缩图像
  27. Mat output;
  28. absdiff(image,compressed_img,output); // 计算原图与压缩图之间的差异
  29. output.convertTo(Ela, CV_8UC3, scale_value); // 根据缩放值调整ELA结果的可视化效果
  30. // 显示处理后的图像
  31. imshow(decodedwin, compressed_img); // 显示压缩后的图像
  32. imshow(diffwin, Ela); // 显示差异图像
  33. }
  34. // 主函数
  35. int main (int argc, char* argv[])
  36. {
  37. CommandLineParser parser(argc, argv, "{ input i | ela_modified.jpg | Input image to calculate ELA algorithm. }"); // 解析命令行参数
  38. parser.about("\nJpeg Recompression Example:\n"); // 显示程序信息
  39. parser.printMessage(); // 打印信息
  40. // 读取一个新图像
  41. image = imread(samples::findFile(parser.get<String>("input"))); // 读取图像文件
  42. // 检查图像是否为空
  43. if (!image.empty())
  44. {
  45. processImage(0, 0); // 调用processImage函数处理图像
  46. createTrackbar("Scale", diffwin, &scale_value, 100, processImage); // 创建一个用于调整缩放值的滑动条
  47. createTrackbar("Quality", diffwin, &quality, 100, processImage); // 创建一个用于调整质量值的滑动条
  48. waitKey(0); // 等待用户按键
  49. }
  50. else
  51. {
  52. std::cout << "> Error in load image\n"; // 如果图像加载失败,打印错误信息
  53. }
  54. return 0; // 结束程序
  55. }

1b7c1e88c24c0c5084d9daff82a698d6.png

imencode(".jpg", image, buf, compressing_factor);

763e4643b3cede46cb027f951cd9c75d.png

compressed_img = imdecode(buf, 1);

fbc18145864996a4b327410fbf0c4bdf.png

output.convertTo(Ela, CV_8UC3, scale_value);

a28dd178c9d40051d5be99136cad596e.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/761500?site
推荐阅读
相关标签
  

闽ICP备14008679号