### Python3 + OpenCV 使用灰度直方图判断图片亮度 在图像处理领域,通过分析图像的灰度直方图来判断图片的整体亮度是一种常见且有效的方法。这种方法可以帮助我们在大量图像数据集中筛选出特定亮度级别的图片,对于图像预处理、自动化图像分类等任务有着重要的应用价值。 #### 一、原理介绍 **灰度直方图**是一种表示图像灰度级分布情况的统计图表。它统计了图像中每个灰度级(0-255)出现的频率。通过观察灰度直方图,我们可以直观地了解到一幅图像的亮度特征。例如,如果大部分像素的灰度值都集中在较低的区间(比如0-30),那么这幅图像很可能是暗色调的;反之,如果大部分像素的灰度值分布在较高的区间,则图像更偏向于明亮。 #### 二、关键步骤 1. **图像灰度化**:首先将彩色图像转换为灰度图像,这是因为灰度图像是单通道的,更容易处理。 2. **计算灰度直方图**:使用OpenCV库中的`calcHist`函数计算灰度直方图。 3. **统计暗区像素比例**:遍历灰度直方图,统计灰度值低于一定阈值(例如40)的像素总数,并计算这些像素在所有像素中的占比。 4. **设定阈值**:根据实际需求设定一个阈值(例如0.75),当暗区像素占比超过这个阈值时,判定该图像为暗调图像。 5. **结果输出**:根据上述标准,筛选出暗调或亮调的图像并进行相应处理,如保存到指定文件夹。 #### 三、具体实现 下面是使用Python3和OpenCV实现上述功能的示例代码: ```python 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 pixels_sum = r * c # 整个弧度图的像素个数为r*c # 遍历灰度图的所有像素 for row in gray_img: for col in row: if col < 40: # 人为设置的超参数, 表示0~39的灰度值为暗 dark_sum += 1 dark_prop = dark_sum / (pixels_sum) print("dark_sum:", str(dark_sum)) print("pixels_sum:", str(pixels_sum)) print("dark_prop=dark_sum/pixels_sum:", str(dark_prop)) if dark_prop >= 0.75: # 人为设置的超参数: 表示若偏暗像素所占比例超过0.75, 则这张图被认为整体环境黑暗的图片 print(pic_path + " is dark!") cv2.imwrite("../DarkPicDir/" + pic, img) # 把被认为黑暗的图片保存 else: print(pic_path + " is bright!") 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 read_all_pictures(pics_path): if not os.path.exists(pics_path): print("路径错误,路径不存在!") return [] all_pics = [] pics = os.listdir(pics_path) for pic in pics: pic_path = os.path.join(pics_path, pic) if os.path.isfile(pic_path): all_pics.append(pic_path) img = cv2.imread(pic_path) func(img, pic_path, pic) return all_pics def create_dark_dir(): dark_dir_path = "../DarkPicDir" is_exists = os.path.exists(dark_dir_path) if not is_exists: os.makedirs(dark_dir_path) print("DarkPicDir is created successfully!") return True else: return False if __name__ == '__main__': pics_path = sys.argv[1] # 获取所给图片目录 create_dark_dir() all_pics = read_all_pictures(pics_path) ``` #### 四、总结 通过以上方法,我们可以有效地利用灰度直方图来判断图像的亮度,这对于自动化图像处理流程非常有用。此外,这种方法还可以进一步扩展,例如结合图像增强技术来改善暗调图像的质量,或者将其应用于视频流处理中,以实时调整视频的亮度。灰度直方图是一种强大的工具,能够帮助我们更好地理解和处理图像数据。
- 粉丝: 5
- 资源: 892
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- GEE Python:Landsat和VITO时序NDVI的加载和对比和预测(最小二乘).ipynb
- 马尔科夫决策过程.docx
- Screenshot_2024-09-08-18-26-07-106_com.tencent.mm.jpg
- contract.pdf
- 这是一张客户档案信息表模板,可登记客户基本资料和财务资料以及各年度汇款情况
- 本地音乐播放器优化版源码20240908
- scratch小游戏(能运行)
- Matlab根据flac、pfc或其他软件导出的坐标及应力、位移数据再现云图 案例包括导出在flac6.0中导出位移的fish代
- 入职一个月的感受,所需要的资源
- 使用批处理脚本调用ModelSim软件对Vivado的设计内容进行仿真的模版