图像预处理
将彩色图像加载到内存。
转换图像为灰度图像,以简化处理。
对灰度图像应用二值化处理,将图像中的纯色区域分为前景和背景。这可以使用阈值处理来完成。
轮廓检测
使用轮廓检测算法,例如OpenCV的 findContours 函数,来寻找二值图像中的所有轮廓。
存储检测到的轮廓以备后续使用。
轮廓筛选
遍历所有检测到的轮廓。
使用 approxPolyDP 函数或其他多边形逼近技术来判断轮廓是否接近于矩形形状。
可以设置一个适当的阈值,以确定轮廓是否足够接近矩形。
可以排除太小或太大的轮廓。
颜色分析
对筛选出的轮廓内的区域进行颜色分析,以确定是否为纯色填充。
选择轮廓内的多个采样点(例如,随机选择或均匀采样),通常在矩形内部以及矩形边界附近。
对每个采样点获取其颜色,可以是RGB颜色或灰度值。
计算采样点颜色的均值或方差。
如果颜色差异低于一定阈值,认为这个区域是纯色填充。
确定矩形参数
确定轮廓是纯色填充矩形,可以获取该轮廓的外接矩形。
外接矩形提供了矩形的位置(x,y),宽度(width),高度(height)信息。
可以获取轮廓的中心点坐标,通过矩形的左上角和右下角坐标计算而得。
输出结果
将每个检测到的纯色填充矩形的参数(x、y、width、height)以及其他相关信息存储在数据结构中。
这些信息可以进一步用于生成报告、可视化或导出到其他系统中。
性能考虑
算法的性能和准确度可能受图像质量、光线条件和颜色变化的影响。
可以进行优化,如多线程处理或GPU加速,以提高性能。
对不同图像和应用场景进行充分测试以验证算法的性能。
实现代码
#!/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
# ---
# 输入一张带矩形纯色填充马赛克的图片,自动拾取出马赛克矩形的x,y,width,height,并排除太小的矩形。
# ---
import cv2
import numpy as np
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:
cv2.rectangle(small_image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 画矩形
# 显示图像
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)