python3+opencv 使用灰度直方图来判断图片的亮暗操作


Posted in Python onJune 02, 2020

1.如何让计算机自动判断一张图是否偏暗?或是判断一张图是否是处于夜晚?我们可以先把图片转换为灰度图,然后根据灰度值的分布来判断,如:

python3+opencv 使用灰度直方图来判断图片的亮暗操作

python3+opencv 使用灰度直方图来判断图片的亮暗操作

我们可以从上图看到,晚上的图片的灰度值是集中在前段的,如0~30多左右,我们再看一张比较明亮的图片:

python3+opencv 使用灰度直方图来判断图片的亮暗操作

明亮的图片的灰度直方图是比较靠后的.

因此要判断图片的亮暗,只需要统计偏暗的像素个数,再除以图片像素的总个数,得到百分比p即可,至于p大于多少即判断为暗,则可以由你自己设置.下面给出代码,此代码可以在装满图片的目录里选出偏暗的图片,然后把这些图片保存下来.

2.代码:

import cv2;
import numpy as np;
import matplotlib.pyplot as plt;
import os;
import sys;
 
def func(img,pic_path,pic):
	#把图片转换为灰度图
	gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY);
	#获取灰度图矩阵的行数和列数
	r,c = gray_img.shape[:2];
	dark_sum=0;	#偏暗的像素 初始化为0个
	dark_prop=0;	#偏暗像素所占比例初始化为0
	piexs_sum=r*c;	#整个弧度图的像素个数为r*c
	
	#遍历灰度图的所有像素
	for row in gray_img:
		for colum in row:
			if colum<40:	#人为设置的超参数,表示0~39的灰度值为暗
				dark_sum+=1;
	dark_prop=dark_sum/(piexs_sum);	
	print("dark_sum:"+str(dark_sum));
	print("piexs_sum:"+str(piexs_sum));
	print("dark_prop=dark_sum/piexs_sum:"+str(dark_prop));
	if dark_prop >=0.75:	#人为设置的超参数:表示若偏暗像素所占比例超过0.78,则这张图被认为整体环境黑暗的图片
		print(pic_path+" is dark!");
		cv2.imwrite("../DarkPicDir/"+pic,img);#把被认为黑暗的图片保存
	else:
		print(pic_path+" is bright!")
	#hist(pic_path); #若要查看图片的灰度值分布情况,可以这个注释解除
 
#用于显示图片的灰度直方图
def hist(pic_path):
	img=cv2.imread(pic_path,0);
	hist = cv2.calcHist([img],[0],None,[256],[0,256])
	plt.subplot(121)
	plt.imshow(img,'gray')
	plt.xticks([])
	plt.yticks([])
	plt.title("Original")
	plt.subplot(122)
	plt.hist(img.ravel(),256,[0,256])
	plt.show()
	
#读取给定目录的所有图片
def readAllPictures(pics_path):
	if not os.path.exists(pics_path):
		print("路径错误,路径不存在!")
		return;
	allPics = [];
	pics = os.listdir(pics_path);
	for pic in pics:
		pic_path = os.path.join(pics_path,pic);
		if os.path.isfile(pic_path):
			allPics.append(pic_path);
			img=cv2.imread(pic_path);
			func(img,pic_path,pic);
	return allPics;
 
#创建用于存放黑暗图片的目录
def createDarkDir():
	DarkDirPath = "../DarkPicDir";
	isExists = os.path.exists(DarkDirPath);
	if not isExists:
		os.makedirs(DarkDirPath);
		print("dark pics dir is created successfully!");
		return True;
	else:
		return False;
 
if __name__ =='__main__':
	pics_path = sys.argv[1];#获取所给图片目录
	createDarkDir();
	allPics=readAllPictures(pics_path);

运行命令: python3 cal.py 图片集的路径名

(其中cal.py 是python代码的文件名)

运行结果:

python3+opencv 使用灰度直方图来判断图片的亮暗操作

然后进入装黑暗图片的目录里,就会看到从空目录变成装有黑暗图片:

python3+opencv 使用灰度直方图来判断图片的亮暗操作

以上这篇python3+opencv 使用灰度直方图来判断图片的亮暗操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
python用pickle模块实现“增删改查”的简易功能
Jun 07 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
Python字符串逆序输出的实例讲解
Feb 16 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
详解PyTorch中Tensor的高阶操作
Aug 18 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
Django中ORM的基本使用教程
Dec 22 Python
Python用户自定义异常的实现
Dec 25 Python
Python如何加载模型并查看网络
Jul 15 Python
Java多线程实现四种方式原理详解
Jun 02 #Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 #Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
Jun 02 #Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 #Python
Python几种常见算法汇总
Jun 02 #Python
opencv-python的RGB与BGR互转方式
Jun 02 #Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 #Python
You might like
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP rsa加密解密使用方法
2015/04/27 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
php微信开发之谷歌测距
2018/06/14 PHP
PHP使用phpunit进行单元测试示例
2019/09/23 PHP
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
分享一些常用的jQuery动画事件和动画函数
2015/11/27 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
微信小程序 引入es6 promise
2017/04/12 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
vue 集成jTopo 处理方法
2019/08/07 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
Vue向后台传数组数据,springboot接收vue传的数组数据实例
2020/11/12 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
python设置检查点简单实现代码
2014/07/01 Python
python 列表删除所有指定元素的方法
2018/04/19 Python
对python中if语句的真假判断实例详解
2019/02/18 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python利用PyPDF2库获取PDF文件总页码实例
2020/04/03 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
Java的基础面试题附答案
2016/01/10 面试题
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
小学生考试获奖感言
2014/01/30 职场文书
优秀教师先进材料
2014/12/16 职场文书
讲文明倡议书
2015/04/29 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript