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

2024-06-05 12:44

本文主要是介绍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;
}

运行结果

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

在这里插入图片描述

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

这篇关于OpenCV如何判断一张图片是否有过高的明暗变化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1033087

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python利用PIL进行图片压缩

《Python利用PIL进行图片压缩》有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所以本文为大家介绍了Python中图片压缩的方法,需要的可以参考下... 有时在发送一些文件如PPT、Word时,由于文件中的图片太大,导致文件也太大,无法发送,所有可以对文件中的图

java获取图片的大小、宽度、高度方式

《java获取图片的大小、宽度、高度方式》文章介绍了如何将File对象转换为MultipartFile对象的过程,并分享了个人经验,希望能为读者提供参考... 目China编程录Java获取图片的大小、宽度、高度File对象(该对象里面是图片)MultipartFile对象(该对象里面是图片)总结java获取图片

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

使用Python实现图片和base64转换工具

《使用Python实现图片和base64转换工具》这篇文章主要为大家详细介绍了如何使用Python中的base64模块编写一个工具,可以实现图片和Base64编码之间的转换,感兴趣的小伙伴可以了解下... 简介使用python的base64模块来实现图片和Base64编码之间的转换。可以将图片转换为Bas

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

查询Oracle数据库表是否被锁的实现方式

《查询Oracle数据库表是否被锁的实现方式》本文介绍了查询Oracle数据库表是否被锁的方法,包括查询锁表的会话、人员信息,根据object_id查询表名,以及根据会话ID查询和停止本地进程,同时,... 目录查询oracle数据库表是否被锁1、查询锁表的会话、人员等信息2、根据 object_id查询被

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for