长沙天津网站建设,2021国外免费服务器,可以绑定域名的免费网站,长沙优秀网站建设读取图像 首先#xff0c;加载待处理的图像#xff0c;可以使用图像处理库#xff08;例如OpenCV#xff09;来实现这一步。确保已加载正确的图像。 定义特定颜色范围 确定所需的特定颜色范围。这将是要检测的马赛克填充的颜色。需要指定颜色的下限值和上限值#xff0c;通…读取图像 首先加载待处理的图像可以使用图像处理库例如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: zj850324yeah.net
# Site:
# Time: 10月 13, 2023
# ---
# 计算遮盖率
# ---
import cv2
import numpy as npdef calculate_intersection(mask1, mask2):# 计算两个掩膜的交集return cv2.bitwise_and(mask1, mask2)def extract_and_draw_mosaics(image_path, min_mosaic_size10, max_display_width1600, 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.0new_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:# 创建一个与提取的矩形相同大小的maskmosaic_mask np.zeros_like(mask)# 计算差异假设宽度差异为dw高度差异为dhdw, dh 5, 10x_offset, y_offset 5, 5mosaic_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)实现效果