引言
在图像处理任务中,夜间图像可能由于光线不足而成为噪声数据。如何有效地过滤夜间图像成为一个重要问题。本文介绍一种基于地理位置和时间的日出日落时间过滤法,结合 astral 库和图像元信息快速实现夜间图像过滤。
在图像处理任务中,夜间图像往往由于光线不足而成为噪声数据,无法满足高质量视觉任务的需求。因此,过滤掉夜间图像是许多场景中非常重要的一步。
传统方法的弊端
传统的夜间图像过滤方法通常基于固定的时间段,例如认为每天的 18:00 至次日 6:00 是夜间,而其他时间段是白天。这种方法的主要弊端包括:
无法适应不同地区的日出日落时间: 不同经纬度的日出日落时间差异较大,固定时间段的方法在全球范围内无法准确区分白天和夜晚。例如,夏季和冬季的日照时间可能相差数小时。
缺乏灵活性: 固定时间无法适应实际需求,有时需要扩展白天时间范围,比如早晨的日出前一小时或傍晚的日落后一小时。
我们方案的优势
本文介绍一种基于 日出日落时间 的夜间图像过滤方法,具有以下优势:
根据地理位置动态计算: 使用 astral 库,根据图像拍摄地的经纬度动态计算当天的日出和日落时间。
灵活设置时间范围: 支持设置日出前或日落后的时间偏移(如日出前 1 小时、日落后 2 小时),满足不同场景的需求。
自动化程度高: 结合文件名或图像元信息自动提取拍摄时间,不需要手动指定。
通过以上改进方法,我们的方案能够更加智能、精准地过滤夜间图像,适用于全球范围的多样化场景。
实现思路
1. 从文件名或元信息提取时间
首先需要获取图像的拍摄时间。如果文件名中包含时间,可以直接提取;如果没有时间字段,可以通过读取图像的 EXIF 元数据(如拍摄时间)来获取。
2. 计算日出日落时间
根据图像拍摄时间和地理坐标,计算当天的日出和日落时间,并可以通过偏移量扩展白天范围。例如,可以设置日出前 1 小时和日落后 1 小时作为白天时间。
3. 判断时间范围
对每张图像,判断拍摄时间是否在白天范围内,若是则保留,否则丢弃。
代码实现
从文件名或元信息提取时间:
def extract_time_from_exif(image_path):
"""
从图像的 EXIF 元数据中提取拍摄时间
:param image_path: 图像路径
:return: 拍摄时间(datetime)或 None
"""
from PIL import Image
from PIL.ExifTags import TAGS
try:
image = Image.open(image_path)
exif_data = image._getexif()
if exif_data:
for tag, value in exif_data.items():
decoded = TAGS.get(tag, tag)
if decoded == "DateTimeOriginal":
return datetime.strptime(value, "%Y:%m:%d %H:%M:%S")
except Exception as e:
print(f"无法提取 EXIF 时间: {e}")
return None
判断白天时间范围:
def is_within_daylight(photo_time, latitude, longitude):
"""
判断拍摄时间是否在白天时间范围内
"""
location = LocationInfo(latitude=latitude, longitude=longitude)
s = sun(location.observer, date=photo_time.date())
start_time = s['sunrise'] + timedelta(hours=-1) # 日出前 1 小时
end_time = s['sunset'] + timedelta(hours=1) # 日落后 1 小时
return start_time <= photo_time <= end_time
使用方式
示例代码:
filter_instance = DaylightImageFilter(sunrise_offset=-1, sunset_offset=1, default_lat=36.48, default_lon=128.21)
input_folder = "your_input_folder"
output_folder = "your_output_folder"
filter_instance.filter_images(input_folder, output_folder)
参数说明
- sunrise_offset:日出前的时间偏移(单位为小时,负数表示提前)。
- sunset_offset:日落后的时间偏移(单位为小时,正数表示延后)。
- default_lat 和 default_lon:默认的地理坐标(可以根据拍摄地调整)