提取纯色马赛克

​​​​​​

图像预处理


将彩色图像加载到内存。
转换图像为灰度图像,以简化处理。
对灰度图像应用二值化处理,将图像中的纯色区域分为前景和背景。这可以使用阈值处理来完成。

轮廓检测


使用轮廓检测算法,例如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)

实现效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外码斯迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值