OpenCV如何判断一张图片是否有过高的明暗变化

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

前言

判断一张图片是否有过高的明暗变化,可以通过分析图像的亮度分布一致性来实现。一种常见的做法是计算图像的亮度标准差(Standard Deviation)。标准差越大,表示图像中的亮度差异越大,即明暗变化可能较为剧烈。

代码实现

在C++中,你可以直接使用OpenCV库与C++标准库或Boost等数学库结合来计算图像的亮度标准差。虽然OpenCV的cv::Mat类本身不直接提供标准差计算函数,但你可以利用OpenCV的数据结构配合C++ STL中的算法来实现这一功能。以下是一个使用C++和OpenCV计算图像亮度标准差的例子:

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>

/**
 * 计算灰度图像的亮度标准差
 * @param imgGray 输入的灰度图像,必须是单通道的8位无符号整型图像。
 * @return 返回图像亮度的标准差。
 * 
 * 该函数接收一个灰度图像作为输入,首先验证图像的类型是否满足要求,
 * 然后使用OpenCV的meanStdDev函数计算图像亮度的均值和标准差。
 * 最后,函数返回计算得到的亮度标准差。
 */
double calculateBrightnessStdDev( const cv::Mat& imgGray )
{
    // 确保输入图像为单通道的8位无符号整型灰度图像
    CV_Assert( imgGray.type() == CV_8UC1 );

    // 计算图像的均值和标准差
    cv::Scalar mean, stddev;
    cv::meanStdDev( imgGray, mean, stddev );

    // 返回图像亮度的标准差
    return stddev.val[ 0 ];
}

int main( int argc, char** argv )
{
    // 读取图像并转换为灰度
    cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/fruit.jpg", cv::IMREAD_GRAYSCALE );
    if ( img.empty() )
    {
        std::cerr << "Could not open or find the image" << std::endl;
        return -1;
    }

    // 计算并打印图像的亮度标准差
    double stdDev = calculateBrightnessStdDev( img );
    std::cout << "The standard deviation of brightness in the image fruit is: " << stdDev << std::endl;

    img    = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/black.jpg", cv::IMREAD_GRAYSCALE );
    stdDev = calculateBrightnessStdDev( img );
    std::cout << "The standard deviation of brightness in the image black is: " << stdDev << std::endl;

    return 0;
}

运行结果

我拿了两张图进行计算,如下:

运行结果如下:

从结果看出第一张的明暗变化度明显大于第二张图像的明暗变化度

相关推荐
共绩算力6 分钟前
Llama 4 Maverick Scout 多模态MoE新里程碑
人工智能·llama·共绩算力
DashVector1 小时前
向量检索服务 DashVector产品计费
数据库·数据仓库·人工智能·算法·向量检索
AI纪元故事会1 小时前
【计算机视觉目标检测算法对比:R-CNN、YOLO与SSD全面解析】
人工智能·算法·目标检测·计算机视觉
音视频牛哥1 小时前
从协议规范和使用场景探讨为什么SmartMediaKit没有支持DASH
人工智能·音视频·大牛直播sdk·dash·dash还是rtmp·dash还是rtsp·dash还是hls
赞奇科技Xsuperzone2 小时前
DGX Spark 实战解析:模型选择与效率优化全指南
大数据·人工智能·gpt·spark·nvidia
音视频牛哥2 小时前
SmartMediaKit:如何让智能系统早人一步“跟上现实”的时间架构--从实时流媒体到系统智能的演进
人工智能·计算机视觉·音视频·音视频开发·具身智能·十五五规划具身智能·smartmediakit
喜欢吃豆2 小时前
OpenAI Agent 工具全面开发者指南——从 RAG 到 Computer Use —— 深入解析全新 Responses API
人工智能·microsoft·自然语言处理·大模型
音视频牛哥3 小时前
超清≠清晰:视频系统里的分辨率陷阱与秩序真相
人工智能·机器学习·计算机视觉·音视频·大牛直播sdk·rtsp播放器rtmp播放器·smartmediakit
johnny2333 小时前
AI视频创作工具汇总:MoneyPrinterTurbo、KrillinAI、NarratoAI、ViMax
人工智能·音视频
Coovally AI模型快速验证3 小时前
当视觉语言模型接收到相互矛盾的信息时,它会相信哪个信号?
人工智能·深度学习·算法·机器学习·目标跟踪·语言模型