添加判断截图方法
This commit is contained in:
@@ -268,3 +268,61 @@ def parse_clarity(image):
|
||||
except Exception as e:
|
||||
logging.error("获取图片清晰度失败", exc_info=e)
|
||||
return clarity_result
|
||||
|
||||
|
||||
def is_photo_by_exif(exif_tags):
|
||||
"""分析EXIF数据判断是否为照片"""
|
||||
# 照片通常包含的EXIF标签
|
||||
photo_tags = [
|
||||
'FNumber', # 光圈
|
||||
'ExposureTime', # 曝光时间
|
||||
'ISOSpeedRatings', # ISO
|
||||
'FocalLength', # 焦距
|
||||
'LensModel', # 镜头型号
|
||||
'GPSLatitude' # GPS位置信息
|
||||
]
|
||||
|
||||
# 统计照片相关的EXIF标签数量
|
||||
photo_tag_count = 0
|
||||
if exif_tags:
|
||||
for tag in photo_tags:
|
||||
if tag in exif_tags:
|
||||
photo_tag_count += 1
|
||||
# 如果有2个以上照片相关的EXIF标签,倾向于是照片
|
||||
if photo_tag_count >= 2:
|
||||
return True
|
||||
# 不确定是照片返回False
|
||||
return False
|
||||
|
||||
|
||||
def is_screenshot_by_image_features(image):
|
||||
"""分析图像特征判断是否为截图"""
|
||||
# 定义边缘像素标准差阈值,小于此阈值则认为图片是截图
|
||||
edge_std_threshold = 20.0
|
||||
try:
|
||||
# 检查边缘像素的一致性(截图边缘通常更整齐)
|
||||
edge_pixels = []
|
||||
# 取图像边缘10像素
|
||||
edge_pixels.extend(image[:10, :].flatten()) # 顶部边缘
|
||||
edge_pixels.extend(image[-10:, :].flatten()) # 底部边缘
|
||||
edge_pixels.extend(image[:, :10].flatten()) # 左侧边缘
|
||||
edge_pixels.extend(image[:, -10:].flatten()) # 右侧边缘
|
||||
|
||||
# 计算边缘像素的标准差(值越小说明越一致)
|
||||
edge_std = numpy.std(edge_pixels)
|
||||
logging.info(f"边缘像素标准差: {edge_std}")
|
||||
return edge_std < edge_std_threshold
|
||||
except Exception as e:
|
||||
logging.error("图像特征分析失败", exc_info=e)
|
||||
return False
|
||||
|
||||
|
||||
def is_screenshot(image, exif_tags):
|
||||
"""综合判断是否是截图"""
|
||||
# 先检查EXIF数据
|
||||
result_of_exif = is_photo_by_exif(exif_tags)
|
||||
# 如果有明显的照片EXIF信息,直接判断为照片
|
||||
if result_of_exif:
|
||||
return False
|
||||
# 分析图像特征
|
||||
return is_screenshot_by_image_features(image)
|
||||
|
||||
Reference in New Issue
Block a user