计算A图片所有颜色占B图片红色区域的百分比

python 复制代码
import cv2
import numpy as np


def calculate_overlap_percentage(a_image_path, b_image_path):
    # 读取A组和B组图像
    a_image = cv2.imread(a_image_path)
    b_image = cv2.imread(b_image_path)

    # 将图像从BGR转为HSV色彩空间,便于颜色筛选
    a_hsv = cv2.cvtColor(a_image, cv2.COLOR_BGR2HSV)
    b_hsv = cv2.cvtColor(b_image, cv2.COLOR_BGR2HSV)

    # 设置B组红色的HSV范围
    lower_red = np.array([0, 100, 100])
    upper_red = np.array([10, 255, 255])

    # 提取B组红色区域的掩膜
    b_red_mask = cv2.inRange(b_hsv, lower_red, upper_red)

    # 设置A组颜色区域的HSV范围(棕色和绿色)
    # 棕色的HSV范围
    lower_brown = np.array([10, 30, 30])
    upper_brown = np.array([25, 255, 200])

    # 绿色的HSV范围
    lower_green = np.array([35, 50, 50])
    upper_green = np.array([85, 255, 255])

    # 提取A组棕色和绿色区域的掩膜
    a_brown_mask = cv2.inRange(a_hsv, lower_brown, upper_brown)
    a_green_mask = cv2.inRange(a_hsv, lower_green, upper_green)

    # 合并A组的棕色和绿色区域掩膜
    a_color_mask = cv2.bitwise_or(a_brown_mask, a_green_mask)

    # 计算B组红色区域的像素数量
    b_red_area = cv2.countNonZero(b_red_mask)

    # 在A组中找到与B组红色区域重合的区域
    a_overlap = cv2.bitwise_and(a_color_mask, b_red_mask)

    # 计算A组与B组红色区域重合的像素数量
    a_overlap_area = cv2.countNonZero(a_overlap)

    # 计算A组有颜色区域占B组红色区域的百分比
    overlap_percentage = (a_overlap_area / b_red_area) * 100 if b_red_area != 0 else 0

    return overlap_percentage


# 示例调用
a_image_path = "path_to_a_image.jpg"
b_image_path = "path_to_b_image.jpg"
percentage = calculate_overlap_percentage(a_image_path, b_image_path)
print(f"A组颜色区域占B组红色区域的百分比为: {percentage:.2f}%")

下面查看提取的mask是否正确

python 复制代码
    # 调整显示图像的大小(设置为目标宽度 600 像素)
    height, width = b_red_mask.shape
    target_width = 600
    target_height = int(target_width * height / width)

    # 使用 cv2.resize 调整图像大小
    b_red_mask_resized = cv2.resize(b_red_mask, (target_width, target_height))

    # 显示调整后的B组红色掩膜
    cv2.imshow("B Red Mask", b_red_mask_resized)
    cv2.waitKey(0)  # 等待按键按下
    cv2.destroyAllWindows()  # 关闭所有窗口

下面直接输出图片是户更方便

python 复制代码
cv2.imwrite("a_color_mask.png", a_color_mask)

把a组与b组文件夹下的所有对应的图片进行计算,然后输出到一个txt文件

python 复制代码
import cv2
import numpy as np
import os

def calculate_overlap_percentage(a_image_path, b_image_path):
    # 读取A组和B组图像
    a_image = cv2.imread(a_image_path)
    b_image = cv2.imread(b_image_path)

    # 将图像从BGR转为HSV色彩空间,便于颜色筛选
    a_hsv = cv2.cvtColor(a_image, cv2.COLOR_BGR2HSV)
    b_hsv = cv2.cvtColor(b_image, cv2.COLOR_BGR2HSV)

    # 设置B组红色的HSV范围
    lower_red = np.array([0, 100, 100])
    upper_red = np.array([10, 255, 255])
    
    # 提取B组红色区域的掩膜
    b_red_mask = cv2.inRange(b_hsv, lower_red, upper_red)

    # 设置A组颜色区域的HSV范围(棕色和绿色)
    # 棕色的HSV范围
    lower_brown = np.array([10, 30, 30])
    upper_brown = np.array([25, 255, 200])
    
    # 绿色的HSV范围
    lower_green = np.array([35, 50, 50])
    upper_green = np.array([85, 255, 255])
    
    # 提取A组棕色和绿色区域的掩膜
    a_brown_mask = cv2.inRange(a_hsv, lower_brown, upper_brown)
    a_green_mask = cv2.inRange(a_hsv, lower_green, upper_green)
    
    # 合并A组的棕色和绿色区域掩膜
    a_color_mask = cv2.bitwise_or(a_brown_mask, a_green_mask)

    # 计算B组红色区域的像素数量
    b_red_area = cv2.countNonZero(b_red_mask)

    # 在A组中找到与B组红色区域重合的区域
    a_overlap = cv2.bitwise_and(a_color_mask, b_red_mask)

    # 计算A组与B组红色区域重合的像素数量
    a_overlap_area = cv2.countNonZero(a_overlap)

    # 计算A组有颜色区域占B组红色区域的百分比
    overlap_percentage = (a_overlap_area / b_red_area) * 100 if b_red_area != 0 else 0
    
    return overlap_percentage

def process_images(a_folder, b_folder, output_file):
    # 获取文件夹中的所有文件
    a_files = sorted(os.listdir(a_folder))
    b_files = sorted(os.listdir(b_folder))

    # 打开输出文件
    with open(output_file, 'w') as f:
        # 遍历文件夹中的每一对图片
        for a_file, b_file in zip(a_files, b_files):
            # 拼接完整的文件路径
            a_image_path = os.path.join(a_folder, a_file)
            b_image_path = os.path.join(b_folder, b_file)

            # 确保文件是图片文件
            if not a_file.endswith(('.jpg', '.png', '.jpeg')) or not b_file.endswith(('.jpg', '.png', '.jpeg')):
                continue

            # 计算重叠百分比
            percentage = calculate_overlap_percentage(a_image_path, b_image_path)

            # 写入结果到txt文件
            f.write(f'{a_file} vs {b_file}: {percentage:.2f}%\n')

            print(f'{a_file} vs {b_file}: {percentage:.2f}%')

# 文件夹路径
a_folder = 'path_to_a_folder'  # A组文件夹路径
b_folder = 'path_to_b_folder'  # B组文件夹路径
output_file = 'overlap_results.txt'  # 输出的txt文件路径

# 处理文件夹中的所有图片并输出到txt文件
process_images(a_folder, b_folder, output_file)
相关推荐
测试开发技术2 分钟前
AI 测试提效 | 告别手工写脚本,分享我的 Playwright + Skill 批量生成 UI 自动化脚本方案
自动化测试·人工智能·ui·自动化·agent·skill·ai测试
乐思智能科技有限公司15 分钟前
PLECS软件学习使用(二)直流电机基本系统模型
人工智能·算法·机器学习·面试·职场和发展
极连AI16 分钟前
极连AI平台解读、Codex5.6仅需0.01倍率,无需Token焦虑,极速响应
人工智能·gpt·chatgpt·aigc·ai编程·ai写作·gpu算力
MartinYeung522 分钟前
[论文学习]PACT:溯源感知能力合约——面向智能体安全的参数级溯源
人工智能·学习·安全
带娃的IT创业者25 分钟前
Inkling:当开源模型开始思考“如何思考”
人工智能·开源·大语言模型·多模态·moe·开源模型·inkling
远航计算机44 分钟前
职业技能培训机构如何利用QClaw+Skills做豆包GEO:知识库搭建×内容创作×效果监测的完整实操手册
大数据·人工智能·自动化·aigc·火山引擎
旋生万物1 小时前
电磁力 = 螺旋联络的 90° 旋转?麦克斯韦方程组的几何重构
人工智能·python·算法·机器学习·copilot·世界模型·物理ai
Vince的修炼之路1 小时前
防 Prompt 注入安全技术深度分析
人工智能·安全
Vince的修炼之路1 小时前
RAG 文档处理技术深度分析:PDF 解析、表格提取、OCR 识别全链路
人工智能·架构
Vuji1 小时前
MCP: 一条 tool 调用链路的旅程
前端·人工智能