基于日出日落时间过滤夜间图像

引言

在图像处理任务中,夜间图像可能由于光线不足而成为噪声数据。如何有效地过滤夜间图像成为一个重要问题。本文介绍一种基于地理位置时间日出日落时间过滤法,结合 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:默认的地理坐标(可以根据拍摄地调整)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值