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

作者:ZJE_ANDY 时间:2024-01-01 07:07:23 

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 使用灰度直方图来判断图片的亮暗操作

来源:https://blog.csdn.net/u014453898/article/details/80745987

标签:python3,opencv,灰度,直方图,亮暗
0
投稿

猜你喜欢

  • MySQL列类型的选择与MySQL的查询效率

    2009-01-14 12:53:00
  • Security安装 Elastic SIEM 和 EDR的超详细教程

    2022-03-08 19:55:43
  • python类的方法属性与方法属性的动态绑定代码详解

    2023-07-02 03:31:26
  • Python for Informatics 第11章之正则表达式(四)

    2023-06-15 04:48:39
  • django中ImageField的使用详解

    2023-09-28 03:58:37
  • Element树形控件整合带图标的下拉菜单(tree+dropdown+input)

    2023-07-02 16:45:35
  • 整理Python最基本的操作字典的方法

    2022-03-01 07:04:38
  • php中mysql连接方式PDO使用详解

    2023-11-06 02:46:43
  • Python实现学生管理系统的完整代码(面向对象)

    2023-09-11 19:08:55
  • 从0到1构建vueSSR项目之路由的构建

    2024-05-09 09:52:33
  • 基于PHP实现用户注册登录功能

    2024-04-30 08:48:35
  • 浅谈django model postgres的json字段编码问题

    2021-12-21 13:55:12
  • Unobtrusive的Web开发

    2007-11-23 13:13:00
  • Python深度强化学习之DQN算法原理详解

    2023-03-05 12:02:51
  • python 模拟登陆163邮箱

    2021-08-03 09:30:11
  • 给验证码增加干扰的杂点

    2008-05-16 11:34:00
  • MySQL中索引优化distinct语句及distinct的多字段操作

    2024-01-18 20:43:38
  • python实现简单的购物程序代码实例

    2022-09-03 05:29:13
  • pygame游戏之旅 计算游戏中躲过的障碍数量

    2022-02-13 19:09:16
  • python爬虫开发之PyQuery模块详细使用方法与实例全解

    2021-05-28 20:54:29
  • asp之家 网络编程 m.aspxhome.com