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计算图像亮度标准差的例子:

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


运行结果

我拿了两张图进行计算,如下:
在这里插入图片描述

在这里插入图片描述

运行结果如下:
在这里插入图片描述
从结果看出第一张的明暗变化度明显大于第二张图像的明暗变化度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/693295.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA技术设计模式

设计模式结构图 设计原则 职责单一原则接口隔离原则 一个类对另一个类的依赖应该建立在最小的接口上 依赖倒置面向接口编程,参数或变量,依赖注入,使用父类 开闭原则 对扩展开放(对提供方),对修改关闭(对使用方) 用抽象构建框架,用实现扩展细节 里氏替换原则…

计算机网络--物理层

计算机网络--计算机网络概念 计算机网络--物理层 计算机网络--数据链路层 计算机网络--网络层 计算机网络--传输层 计算机网络--应用层 1. 基本概念 物理层的概念&#xff1a;物理层解决如何在在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输…

STM32编程:实现LED灯闪烁(基于手写SDK的方式)

项目结构 stm32f10x.h 文件 //寄存器的值常常是芯片外设自动更改的&#xff0c;即使CPU没有执行程序&#xff0c;也有可能发生变化 //编译器有可能会对没有执行程序的变量进行优化//volatile表示易变的变量&#xff0c;防止编译器优化&#xff0c; #define __IO volati…

2024-6-9 石群电路-27

2024-6-9&#xff0c;星期日&#xff0c;12:49&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。Hello&#xff0c;大家&#xff0c;我回来啦&#xff0c;昨天断更了一天&#xff0c;是为什么捏&#xff0c;是因为&#xff0c;我通过毕业答辩啦&#xff01;&…

数据挖掘分析的一点进步分享

import pandas as pd import matplotlib.pyplot as plt import numpy as npdata pd.read_csv(heros.csv,encoding"gbk") data.head() 导入数据集 进行分析 df_datadata.copy() df_data.describe()df_data.info() df_data.drop(英雄,axis1,inplaceTrue) df_data[最…

[C++初阶]string类的详解

一、string类的模拟实现 上面已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢让我们来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。大家看下以下string类的实现是…

Flink 问题之 No Watermark (Watermarks are only available if EventTime is used)

问题背景 Flink-1.17.0在集群下&#xff0c;获取Kafka集群数据&#xff0c;进行流模式实时计算&#xff0c;Watermarks提示&#xff1a;No Watermark (Watermarks are only available if EventTime is used)&#xff1b; source数据源是从kafka中读取topic数据&#xff0c;经…

【最新鸿蒙应用开发】——ArkUI两种开发范式

在进行鸿蒙应用开发&#xff0c;openHarmony提供了一种页面开发框架叫做ArkUI方舟框架来进行页面布局的开发。 ArkUI方舟UI框架 针对不同的应用场景及技术背景&#xff0c;方舟UI框架提供了两种开发范式&#xff0c;分别是基于ArkTS的声明式开发范式&#xff08;简称“声明式…

分享美好,高清无阻 - 直播极简联网解决方案

1、需求背景 随着移动互联网、UGC模式和直播平台的发展&#xff0c;网络直播的门槛日益降低&#xff0c;越来越多的人希望成为直播的主角。基于物联网的户外直播无线联网解决方案应运而生&#xff0c;满足直播者的需求。 户外直播无线联网解决方案提供了无处不在的直播体验&a…

UniAnimate:华科提出人类跳舞视频生成新框架,支持合成一分钟高清视频

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

Java 环境配置 -- Java 语言的安装、配置、编译与运行

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 002 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

未来AI大模型的发展趋势

大家好&#xff0c;我是小悟 未来AI大模型的发展趋势无疑将是多元化、高效化、普及化以及人性化。随着技术的飞速进步&#xff0c;AI大模型将在各个领域中展现出更加广泛和深入的应用&#xff0c;成为推动社会进步的重要力量。 多元化是AI大模型发展的重要方向。随着数据量的…

vue26:vue的环境搭建

vue环境安装配置 在点击上方链接前&#xff0c;注意&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 下方的红字&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

在 Qt Creator 上创建 ROS 项目并新建/导入 ROS 包

0、引言 ⚠️ 在开始之前&#xff0c;您需要确保您已经为 Qt 配置好了 ROS 开发环境了。如果您还没有配置好&#xff0c;可以参考这篇文章 本文将着手探讨如何在 Qt Creator 上编辑 ROS 项目&#xff08;工作空间&#xff09;。 1、本教程使用到的相关软件或产品 Ubuntu 20.0…

【AI基础】第四步:保姆喂饭级-langchain+chatglm2-6b+m3e-base

在第三步手动安装chatglm2-6b时&#xff0c;已经可以通过web进行交互。langchain重新封装了一下AI框架&#xff0c;提供更加友好的开发功能&#xff0c;类似于AI届的spring框架。langchain的安装过程也类似于上一步说的&#xff1a;【AI基础】第三步&#xff1a;纯天然手动安装…

github异常问题总结

问题1&#xff1a; gitgitlab.gz.cvte.cn: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解决方法&#xff1a; 这个错误表示 GitLab 服务器拒绝了你的 SSH…

【MySQL】(基础篇二) —— MySQL初始用

MySQL初始用 目录 MySQL初始用基本语法约定选择数据库查看数据库和表其它的SHOW 在Navicat中&#xff0c;大部分数据库管理相关的操作都可以通过图形界面完成&#xff0c;这个很简单&#xff0c;大家可以自行探索。虽然Navicat等图形化数据库管理工具为操作和管理数据库提供了非…

【小白专用24.6.8】c#异步方法 async task调用及 await运行机制

await是C#中用于等待异步操作完成的关键字。它通常用于异步方法内部&#xff0c;使得在等待异步操作期间&#xff0c;线程可以继续执行其他操作&#xff0c;从而保持程序的响应性。 在使用await时&#xff0c;需要注意以下几点&#xff1a; 1. async修饰符&#xff1a; 使用…

PgSQL技术内幕 - psql与服务端连接与交互机制

PgSQL技术内幕 - 客户端psql与服务端连接与交互机制 简单来说&#xff0c;PgSQL的psql客户端向服务端发起连接请求&#xff0c;服务端接收到请求后&#xff0c;fork出一个子进程&#xff0c;之后由该子进程和客户端进行交互&#xff0c;处理客户端的SQL等&#xff0c;并将结果返…

用HAL库改写江科大的stm32入门-输入捕获原理图示

原理与接线&#xff1a; &#xff08;输入捕获的结构&#xff09; cubeMx: PA11&#xff1a;