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

ela_modified.jpg

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

差异图像Ela

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

cpp 复制代码
/**
  @file ela.cpp
  @author Alessandro de Oliveira Faria (A.K.A. CABELO)
  @brief 错误等级分析(ELA)技术,可以识别出图像中不同压缩级别的区域。对于JPEG图片,整张图片应当大致在相同的水平。如果图片的某个部分与众不同,表明很可能进行了数字修改。这个例子可以通过压缩错误分析,直观地查看JPG图片的修改情况。有疑问或建议请通过邮件联系Alessandro de Oliveira Faria cabelo[at]opensuse[dot]org或OpenCV团队。
  @date 2018年6月24日
*/


#include <opencv2/highgui.hpp>
#include <iostream>


using namespace cv;


int scale_value = 7; // 初始化缩放值为7
int quality = 95;    // 初始化质量为95
Mat image;           // 定义原始图像的矩阵
Mat compressed_img;  // 定义压缩后的图像矩阵
const char* decodedwin = "the recompressed image"; // 压缩图像窗口标题
const char* diffwin = "scaled difference between the original and recompressed images"; // 差异图像窗口标题


// 处理图像并显示
static void processImage(int , void*)
{
    Mat Ela; // 定义ELA处理结果矩阵


    // JPEG压缩步骤
    std::vector<int> compressing_factor; // 定义压缩因子
    std::vector<uchar> buf; // 定义压缩缓冲区


    compressing_factor.push_back(IMWRITE_JPEG_QUALITY); // 添加JPEG质量压缩参数
    compressing_factor.push_back(quality); // 添加当前质量值


    imencode(".jpg", image, buf, compressing_factor); // 压缩图像


    compressed_img = imdecode(buf, 1); // 解压缩图像


    Mat output;
    absdiff(image,compressed_img,output); // 计算原图与压缩图之间的差异
    output.convertTo(Ela, CV_8UC3, scale_value); // 根据缩放值调整ELA结果的可视化效果


    // 显示处理后的图像
    imshow(decodedwin, compressed_img); // 显示压缩后的图像
    imshow(diffwin, Ela); // 显示差异图像
}


// 主函数
int main (int argc, char* argv[])
{
    CommandLineParser parser(argc, argv, "{ input i | ela_modified.jpg | Input image to calculate ELA algorithm. }"); // 解析命令行参数
    parser.about("\nJpeg Recompression Example:\n"); // 显示程序信息
    parser.printMessage(); // 打印信息


    // 读取一个新图像
    image = imread(samples::findFile(parser.get<String>("input"))); // 读取图像文件


    // 检查图像是否为空
    if (!image.empty())
    {
        processImage(0, 0); // 调用processImage函数处理图像
        createTrackbar("Scale", diffwin, &scale_value, 100, processImage); // 创建一个用于调整缩放值的滑动条
        createTrackbar("Quality", diffwin, &quality, 100, processImage); // 创建一个用于调整质量值的滑动条
        waitKey(0); // 等待用户按键
    }
    else
    {
        std::cout << "> Error in load image\n"; // 如果图像加载失败,打印错误信息
    }


    return 0; // 结束程序
}
javascript 复制代码
imencode(".jpg", image, buf, compressing_factor);
ini 复制代码
compressed_img = imdecode(buf, 1);
css 复制代码
output.convertTo(Ela, CV_8UC3, scale_value);
相关推荐
z小猫不吃鱼17 小时前
14 BERT 的 Masked Language Modeling 详解
人工智能
努力的章鱼bro17 小时前
CUDA编程入门
c++·人工智能·cuda
Bode_200217 小时前
移动多智能体现场柔性测量与自适应质检的难点与实现路径
人工智能·计算机视觉·制造
Honker_yhw17 小时前
大数据管理与应用系列丛书《数据挖掘》(吕欣等著)读书笔记-集成学习与 AdaBoost
人工智能·数据挖掘·集成学习
weixin_4080996717 小时前
2026 AI生成图片快速去水印的5种实测方法(附在线工具 + Python/Java/PHP API代码)
java·人工智能·python·api接口·ai去水印·石榴智能·自动去水印
云智慧AIOps社区17 小时前
直击BEYOND Expo 2026 | 云智慧Cloudwise亮相澳门,发布“三层战略”护航 AI 数实共生
运维·人工智能·运维自动化·ai基础设施可靠性
行业研究员17 小时前
2026 AI Agent记忆解决方案:腾讯云数据库提供全场景支撑
数据库·人工智能·腾讯云·ai记忆
西安同步高经理17 小时前
国产音频频谱分析仪使用案例,多通道音频分析仪,音频频谱分析仪
大数据·人工智能·音视频
好家伙VCC17 小时前
动态因子图谱+滚动SHAP重构量化模型可解释性
java·人工智能·重构
dingzd9517 小时前
TikTok创作者AI搜索推出后跨境品牌如何提高达人匹配效率
大数据·人工智能·新媒体运营·市场营销·跨境