计算两个图形遮盖率

读取图像


首先,加载待处理的图像,可以使用图像处理库(例如OpenCV)来实现这一步。确保已加载正确的图像。

定义特定颜色范围


确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值,通常以BGR(蓝-绿-红)或HSV(色相-饱和度-明度)颜色空间表示。

转换颜色空间


将图像从BGR颜色空间转换为HSV颜色空间。这是因为在HSV颜色空间中更容易定义颜色范围。

创建颜色掩模

使用颜色的下限值和上限值在HSV图像中创建一个掩模,该掩模会高亮符合颜色范围的区域。掩模是一个二值图像,其中颜色范围内的像素为白色,其他像素为黑色。

寻找颜色区域的轮廓

在掩模图像中,使用图像处理技术(例如轮廓检测)来查找颜色区域的轮廓。每个轮廓代表一个特定颜色的填充矩形。

排除小矩形


在上述步骤中,会得到所有颜色填充区域的轮廓。然后,根据要求排除太小的矩形。可以通过设定一个阈值来过滤掉宽度或高度小于该阈值的矩形。

计算遮罩与标记的交集

对于筛选后的矩形,需要将它们与标记进行比较,以计算遮罩与标记的交集。这包括以下步骤:
获取矩形的坐标和尺寸。
获取标记的坐标和尺寸。

计算遮盖率


计算交集区域的面积并除以标记区域的面积,以获得遮盖率。

分类漏检、误检和正检
每一个标记需指定对应的马赛克,误检、漏检、正检分类规则如下:
无马赛克指定的标记判定为马赛克漏检,遮盖率为0%;
有马赛克但无对应标记的判定为马赛克误检,不计算遮盖率;
有马赛克且有对应标记的判定为马赛克正检,遮盖率为[0%,100%]。

实现代码

#!/anaconda3/envs/FEALPy/bin python3.7
# -*- coding: utf-8 -*-
# ---
# @Software: PyCharm
# @File: get_mosaic.py
# @Author: jerry
# @E-mail: zj850324@yeah.net
# @Site: 
# @Time: 10月 13, 2023
# ---
# 计算遮盖率
# ---
import cv2
import numpy as np

def calculate_intersection(mask1, mask2):
    # 计算两个掩膜的交集
    return cv2.bitwise_and(mask1, mask2)

def extract_and_draw_mosaics(image_path, min_mosaic_size=10, max_display_width=1600, target_color=(181, 230, 29)):
    # 读取图像
    image = cv2.imread(image_path)

    # 计算缩放比例
    width, height = image.shape[1], image.shape[0]
    scale = max_display_width / width if width > max_display_width else 1.0
    new_width = int(width * scale)
    new_height = int(height * scale)

    # 缩小图像
    small_image = cv2.resize(image, (new_width, new_height))

    # 定义目标颜色的阈值范围
    lower_color = np.array([target_color[2] - 1, target_color[1] - 1, target_color[0] - 1])
    upper_color = np.array([target_color[2] + 1, target_color[1] + 1, target_color[0] + 1])

    # 使用阈值操作找到目标颜色填充的区域
    mask = cv2.inRange(small_image, lower_color, upper_color)

    # 查找轮廓
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 提取满足最小尺寸要求的马赛克并画在图像上
    for contour in contours:
        x, y, w, h = cv2.boundingRect(contour)
        if w >= min_mosaic_size and h >= min_mosaic_size:
            # 创建一个与提取的矩形相同大小的mask
            mosaic_mask = np.zeros_like(mask)

            # 计算差异,假设宽度差异为dw,高度差异为dh
            dw, dh = 5, 10
            x_offset, y_offset = 5, 5

            mosaic_mask[y + y_offset:y + h + y_offset + dh, x + x_offset:x + w + x_offset + dw] = 1

            # 计算交集
            intersection = np.logical_and(mosaic_mask, mask)

            # 计算遮盖率
            mosaic_area = mosaic_mask.sum()
            intersection_area = intersection.sum()
            coverage = intersection_area / float(mosaic_area)

            # 画提取的矩形(绿色边框)
            cv2.rectangle(small_image, (x, y), (x + w, y + h), (0, 255, 0), 2)

            # 画创建的矩形(红色边框)
            cv2.rectangle(small_image, (x + x_offset, y + y_offset), (x + x_offset + w + dw, y + y_offset + h + dh),
                          (0, 0, 255), 2)

            print(f"提取的矩形位置:(x: {x}, y: {y}), 宽度: {w}, 高度: {h}")
            print(f"创建的矩形位置:(x: {x + x_offset}, y: {y + y_offset}), 宽度: {w + dw}, 高度: {h + dh}")
            print(f"遮盖率:{coverage:.2f}")

    # 显示图像
    cv2.imshow('Image with Mosaics', small_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 使用示例
image_path = './images/1.png'  # 图像路径
min_mosaic_size = 10  # 定义最小马赛克大小
max_display_width = 1600  # 定义最大显示宽度
target_color = (181, 230, 29)  # 定义目标颜色

extract_and_draw_mosaics(image_path, min_mosaic_size, max_display_width, target_color)

实现效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/156176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机语音芯片在工业控制中的应用优势

单片机语音芯片,这一智能化的代表产品,不仅在家庭和消费电子领域发挥着重要的作用,更为工业控制领域注入了新的活力。将单片机语音芯片与语音交互技术相结合,为工业设备的控制和监测提供了前所未有的解决方案。 首先,…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源:宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三) 教程背景 通过之前的教程,我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装,并创建了一个计数器项目。在本期教…

法与智融合,拓世科技集团子公司教授加拓世团队培训大会圆满成功

2023年11月15日,拓世科技集团子公司北京教授加拓世团队抵达拓世集团总部,展开为期两天的参观学习活动,旨在深度挖掘人工智能技术在法律领域的潜力,为法学研究、法律服务行业快速实践数字化提供更加智能高效的支持。 拓世科技集团…

用护眼灯到底好不好?适合小学生用的五款护眼台灯推荐

如果不想家里的孩子年纪小小的就戴着眼镜,从小就容易近视,那么护眼灯的选择就非常重要了,但是市场上那么多品类,价格也参差不齐,到底怎么选呢?大家一定要看完本期内容。为大家推荐五款护眼台灯。 一、书客护…

适用于 Mac 的 10 款最佳数据恢复工具

对于依赖计算机处理重要文件(无论是个人照片还是重要业务文档)的任何人来说,数据丢失都可能是一场噩梦。 值得庆幸的是,有多种数据恢复工具专门用于Mac用户,可以帮助您恢复丢失或意外删除的文件。 在本文中&#xff0c…

开源软件 FFmpeg 生成模型使用图片数据集

本篇文章聊聊,成就了无数视频软件公司、无数在线视频网站、无数 CDN 云服务厂商的开源软件 ffmpeg。 分享下如何使用它将各种视频或电影文件,转换成上万张图片数据集、壁纸集合,来让下一篇文章中的模型程序“有米下锅”,这个方法…

2023最新最全【Python3.11.3】下载安装零基础教程【附安装包】

前言:链接在最底下 Python是一种可在多个平台上运行的计算机程序设计语言,它是一种高层次的脚本语言,结合了解释性、编译性、互动性和面向对象的特点。最初,它的设计目的是用于编写自动化脚本(shell)。但随着版本的更新和新功能的…

STM32H743 RTC精密数字校准 深度剖析

一、问题 项目中数据报文收到的RTC时间总是会慢一些,经过实际几天的测试得出结论:24小时要慢5S左右。根据手册我了解到可以有误差但不会差这么多,所以进行了如下分析并解决问题。 二、分析 1.影响RTC准确性的因素罗列 硬件基础误差(也就是待校准部分) …

JAVAEE初阶 操作系统

操作系统的相关知识 一.操作系统的定位二.操作系统的作用三.什么是进程/任务1.进程在系统中如何操作和管理 四.PCB中的核心属性1.pid2.内存指针3.文件描述符表 五.CPU1.cpu的特性:分时复发 六.PCB中进行调度的属性1.状态2.优先级3.记账信息 一.操作系统的定位 二.操作系统的作用…

开源 | 携程 Redis On Rocks 实践,节省 2/3 Redis成本

作者简介 patpatbear,携程软件技术专家,负责携程缓存内核的维护,热爱开源,专注于高性能、分布式NoSQL系统的建设和应用。 一、背景 redis使用内存作为存储介质,具有良好的性能和低延迟,但其内存容量通常成为…

聊聊ThreadLocal(一)

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 话说《中华英雄》有一个…

【网络】TCP协议的相关实验

TCP协议的相关实验 一、理解listen的第二个参数1、实验现象2、TCP 半连接队列和全连接队列3、关于listen的第二个参数的一些问题4、SYN洪水Ⅰ、什么是SYN洪水攻击Ⅱ、如何解决SYN洪水攻击? 二、使用Wireshark分析TCP通信流程 一、理解listen的第二个参数 在编写TCP…

java“俄罗斯方块”

首先新建议一个包为Tetris (俄罗斯方块) 类名也叫做Tetris; 代码运行: package Tetris; import java.awt.BorderLayout; import java.awt.Color; import java.awt.GridLayout; import java.awt.event.KeyEvent; import java.aw…

Rust图形界面:eGUI的Panel布局

文章目录 Panel布局尺寸调节源码 Panel布局 eGUI提供面板堆叠的布局方案,即Panel布局。其布局逻辑是,根据当前面板指定的方向,尽可能地填充空间。 CentralPanel 占据屏幕剩余部分的空间SidePanel 占据屏幕两侧的空间,在具体调用…

听GPT 讲Rust源代码--library/core/src(5)

题目来自 Understanding Box in Rust 🦀 File: rust/library/core/src/num/saturating.rs 在Rust的核心库中,源代码路径rust/library/core/src/num/saturating.rs所对应的文件是用来实现饱和运算的功能。 饱和运算是一种数值运算的方式,用于处…

中级程序员——uniapp和小程序面试题

😄博主:小猫娃来啦 😄文章核心:uniapp和小程序面试题 文章目录 用uniapp有遇到一些兼容性问题吗?uniapp最大的优点是什么?uniapp如何实现多端兼容?uniapp是如何做跨端适配的?常用的u…

1~2亿条数据需要缓存之安装redis集群(哈希取余分区、一致性哈希算法分区、哈希槽分区)

安装redis集群 面试题 1~2亿条数据需要缓存,请问如何设计这个存储案例??? 回答: 单机单台100%不可能,肯定是分布式存储,用redis如何落地? 上述问题阿里P6~P7工程案例和场景设计类必考题目, 一般业界有3种解决方案 …

Linux学习教程(第三章 Linux文件和目录管理)2

第三章 Linux文件和目录管理(初识Linux命令) 十一、Linux 删除空目录(rmdir命令) Linux rmdir命令:删除空目录 和 mkdir 命令(创建空目录)恰好相反,rmdir(remove empty directories 的缩写)命令用于删除空目录,此命令的基本格式为: [root@localhost ~]# rmdir […

走进ERP管理系统:企业信息化的加速器

走进ERP管理系统:企业信息化的加速器 企业信息化已成为企业提高效率、降低成本、优化资源配置的重要手段。ERP管理系统作为企业信息化的重要组成部分,已经成为了越来越多企业的必备工具。本文将带您走进ERP管理系统,探讨其优势、应用场景以及…