Python3+OpenCV利用灰度直方图自动筛选暗光图片

星野
星野
发布时间:2026-10-13 | 5人浏览过
原创

本文介绍如何使用Python3结合OpenCV库,通过计算图像灰度直方图来自动判断图片的亮暗程度。核心逻辑是将图像转为灰度后,统计低灰度值像素占比,当该比例超过设定阈值(如0.75)时,即判定为暗光图片并保存。文中提供了完整的Python代码示例及命令行运行方法,适用于批量处理图片库中的夜间或低光照场景图像。

基于灰度直方图的亮暗判断原理

要实现计算机自动识别图片是否偏暗,或者判断图片是否处于夜间环境,一种有效的方法是先将其转换为灰度图像,随后分析灰度值的分布情况。例如:

从上述示例图中可以观察到,夜间图片的灰度值主要集中在较低区间,大约在0到30左右。相比之下,我们再看一张亮度较高的图片:

明亮图片的灰度直方图分布则明显偏向较高的数值区间。

因此,判断图片亮暗的关键在于统计灰度值较低的像素数量,并将其除以图片的总像素数,从而得到一个百分比p。至于p超过多少数值时判定为“暗”,这一阈值可由用户自行设定。下面提供的代码实现了在指定图片目录中筛选出偏暗图片,并将其保存的功能。

Python代码实现与运行方法

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 使用灰度直方图来判断图片的亮暗操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表