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;
}

运行结果

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

运行结果如下:

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

相关推荐
NAGNIP6 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab7 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab7 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP11 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年11 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼11 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS11 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区13 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈13 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang13 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx