71 lines
2.3 KiB
Python
Executable File
71 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
import cv2
|
||
import numpy as np
|
||
import os
|
||
import argparse
|
||
|
||
def analyze_sky_ratio(image_path, threshold=200, debug=False):
|
||
"""
|
||
分析图片中白色天空占整个图片的比例
|
||
|
||
参数:
|
||
image_path: 图片路径
|
||
threshold: 灰度阈值,用于区分天空和非天空区域,默认为200(较亮的像素)
|
||
debug: 是否显示处理过程中的图像,用于调试
|
||
|
||
返回:
|
||
sky_ratio: 天空占比(0-1之间的浮点数)
|
||
"""
|
||
# 读取图片
|
||
img = cv2.imread(image_path)
|
||
if img is None:
|
||
raise ValueError(f"无法读取图片: {image_path}")
|
||
|
||
# 转换为灰度图
|
||
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||
|
||
# 使用阈值分割天空区域(天空通常是图像中较亮的部分)
|
||
_, sky_mask = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)
|
||
|
||
# 计算天空区域占比
|
||
total_pixels = gray.shape[0] * gray.shape[1]
|
||
sky_pixels = np.sum(sky_mask == 255)
|
||
sky_ratio = sky_pixels / total_pixels
|
||
|
||
# 调试模式:显示处理过程图像
|
||
if debug:
|
||
# 创建可视化结果
|
||
# 原图
|
||
cv2.imshow('Original Image', img)
|
||
# 灰度图
|
||
cv2.imshow('Grayscale Image', gray)
|
||
# 天空掩码
|
||
cv2.imshow('Sky Mask', sky_mask)
|
||
|
||
# 在原图上标记天空区域
|
||
result = img.copy()
|
||
result[sky_mask == 255] = [0, 255, 255] # 用黄色标记天空区域
|
||
cv2.imshow('Sky Detection Result', result)
|
||
|
||
cv2.waitKey(0)
|
||
cv2.destroyAllWindows()
|
||
|
||
return sky_ratio
|
||
|
||
def main():
|
||
parser = argparse.ArgumentParser(description='分析图片中天空区域占比')
|
||
parser.add_argument('image_path', help='图片路径')
|
||
parser.add_argument('--threshold', type=int, default=200, help='天空区域的灰度阈值(0-255),默认为200')
|
||
parser.add_argument('--debug', action='store_true', help='显示处理过程图像')
|
||
args = parser.parse_args()
|
||
|
||
try:
|
||
sky_ratio = analyze_sky_ratio(args.image_path, args.threshold, args.debug)
|
||
print(f"天空区域占比: {sky_ratio:.2%}")
|
||
except Exception as e:
|
||
print(f"错误: {e}")
|
||
|
||
if __name__ == "__main__":
|
||
main() |