网络编程
位置:首页>> 网络编程>> Python编程>> python3+opencv 使用灰度直方图来判断图片的亮暗操作

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

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

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

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

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com