Python Opencv: 基于颜色提取的印章分割

news2024/11/24 13:34:07

利用Python实现了一个图像处理功能,即批量提取图像中的印章区域;使用了颜色聚类的方法来提取颜色。

本代码也发布到了github,欢迎大家试用(如果帮助,请star一下):

GitHub - AICVHub/seal_seg_opencv: pyhon opencv seal segpyhon opencv seal seg. Contribute to AICVHub/seal_seg_opencv development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/AICVHub/seal_seg_opencv.git

目录

1. 方法

2. 代码

3. 运行结果


1. 方法

  • K-means 聚类 (kmeans_color_quantization 函数): 通过将图像从BGR颜色空间转换到HSV颜色空间,并使用K-means聚类算法来找到图像中的主要颜色。K-means算法是一种无监督学习算法,用于将数据点划分为K个簇,使得每个数据点与其所属簇的中心距离之和最小。

  • 颜色阈值 (extract_seal_with_kmeans 函数): 根据聚类得到的颜色中心,创建HSV颜色空间中的上下界限,以确定与印章颜色相似的像素范围。通过调整hue_threshold参数,可以控制颜色相似度的敏感度。

  • 掩码生成: 使用cv2.inRange函数根据颜色阈值生成掩码,这些掩码用于识别图像中可能包含印章的区域。

  • 掩码膨胀 (cv2.dilate 函数): 对生成的掩码进行膨胀操作,以填补印章区域中的小空洞或连接断裂的部分。

  • 图像合成: 使用掩码提取印章区域,并将其与原图结合在一个透明的背景上。这里使用了PIL库(Python Imaging Library)来处理图像的透明度和合成。

  • 批量处理 (batch_extract_seals_with_dominant_color 函数): 遍历指定文件夹中的所有图像,对每个图像执行印章提取和合成操作,并将结果保存到另一个文件夹。

2. 代码

import cv2
import numpy as np
import os
from sklearn.cluster import KMeans
from PIL import Image


def kmeans_color_quantization(hsv_image, k=2):
    """
    使用 K-means 聚类找到图像中的主要颜色。
    """
    # 重新调整图像大小以加速聚类过程
    resized_image = cv2.resize(hsv_image, (0, 0), fx=0.5, fy=0.5)

    # 将图像数据转换为二维数组,每行是一个像素的 HSV 值
    reshaped_image = resized_image.reshape(-1, 3)

    # 应用 K-means 聚类
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(reshaped_image)

    # 返回聚类中心
    return kmeans.cluster_centers_


def extract_seal_with_kmeans(image_path, output_path, k=4, hue_threshold=15):
    image = cv2.imread(image_path)
    if image is None:
        print(f"Image not found at {image_path}")
        return

    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    dominant_colors = kmeans_color_quantization(hsv_image, k=k)

    masks = []
    for color in dominant_colors:
        lower_color = np.array([color[0] - hue_threshold, 100, 100])
        upper_color = np.array([color[0] + hue_threshold, 255, 255])
        mask = cv2.inRange(hsv_image, lower_color, upper_color)
        masks.append(mask)
    combined_mask = cv2.bitwise_or(masks[0], masks[1]) if len(masks) > 1 else masks[0]

    # 膨胀掩码
    kernel = np.ones((3, 3), np.uint8)
    final_mask = cv2.dilate(combined_mask, kernel, iterations=1)

    # 提取印章区域
    seal = cv2.bitwise_and(image, image, mask=final_mask)

    # 将OpenCV图像转换为PIL图像
    original_image = Image.open(image_path).convert('RGBA')
    seal_pil = Image.fromarray(cv2.cvtColor(seal, cv2.COLOR_BGR2RGBA)).convert('RGBA')

    # 计算新图像的宽度,原图宽度加上印章区域宽度
    original_width, original_height = original_image.size
    seal_width, seal_height = seal_pil.size
    new_width = original_width + seal_width
    new_height = max(original_height, seal_height)

    # 创建一个全透明的图像,用于左右拼接
    transparent_background = Image.new('RGBA', (new_width, new_height), (0, 0, 0, 0))

    # 将原图粘贴到透明背景上
    transparent_background.paste(original_image, (0, 0))

    # 将印章区域粘贴到透明背景的右侧
    transparent_background.paste(seal_pil, (original_width, 0), seal_pil)

    # 保存结果
    transparent_background.save(output_path)

    print(f"Original image and extracted seal combined with transparent background saved to {output_path}")


def batch_extract_seals_with_dominant_color(input_dir, output_dir):
    """
    批量处理文件夹中的所有图像,使用主要颜色进行印章提取。

    参数:
    - input_dir: 包含输入图像的文件夹路径。
    - output_dir: 输出图像的保存文件夹路径。
    """
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for filename in os.listdir(input_dir):
        image_path = os.path.join(input_dir, filename)
        output_path = os.path.join(output_dir, os.path.splitext(filename)[0]+'.png')
        extract_seal_with_kmeans(image_path, output_path)


# 使用示例
if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(description="Batch extract seals with dominant color from images.")
    parser.add_argument("--input_dir", default='/data/projects/Matting/modnet_demo/seals',
                        help="Path to the folder containing input images.")
    parser.add_argument("--output_dir", default='/data/projects/Matting/modnet_demo/output_seals_01',
                        help="Path to the folder for saving output images.")
    args = parser.parse_args()

    batch_extract_seals_with_dominant_color(args.input_dir, args.output_dir)

关于其中一些方法的说明:

KMeans:

KMeans 是一个在机器学习库 scikit-learn 中实现的 K-means 聚类算法的类。K-means 聚类是一种无监督学习算法,它的目标是将数据点划分为 K 个簇,使得每个数据点与其所属簇的中心(即聚类中心)之间的距离之和最小。这种算法在许多领域都有应用,包括图像处理、市场细分、天文数据分析等。

以下是 KMeans 类的一些关键点:

  1. 初始化 (__init__ 方法): 当你创建一个 KMeans 实例时,你需要指定 n_clusters 参数,它代表你想要划分的簇的数量。在这个例子中,k 就是这个参数的值。

  2. 拟合数据 (fit 方法): 调用 fit 方法时,你需要传递一个数据集,通常是二维数组的形式,其中每行代表一个数据点,每列代表一个特征。KMeans 会根据这些数据点初始化簇中心,并迭代地调整簇中心的位置,直到满足停止条件(如达到一定的迭代次数或簇中心的变化小于某个阈值)。

  3. 聚类中心 (cluster_centers_ 属性): 聚类完成后,KMeans 实例的 cluster_centers_ 属性会包含 K 个聚类中心的坐标。每个聚类中心是一个向量,其维度与输入数据的特征维度相同。

  4. 标签分配 (labels_ 属性): 除了聚类中心,KMeans 还会为每个输入数据点分配一个标签,表示它属于哪个簇。这个标签分配是通过计算数据点与各个聚类中心之间的距离来决定的,数据点会被分配到最近的聚类中心所代表的簇。

  5. 优化: K-means 算法在初始化簇中心时可能会陷入局部最优,因此可能需要多次运行以获得更好的结果。KMeans 类提供了 init 参数来指定初始化方法,例如 init='k-means++',这是一种更智能的初始化方法,可以提高找到全局最优解的概率。

  6. 灵活性: KMeans 类还提供了其他参数来调整算法的行为,比如 max_iter(最大迭代次数)、tol(收敛阈值)等。

 cv2.inRange:

在OpenCV中,cv2.inRange 函数用于创建一个掩码(mask),该掩码将图像中与指定颜色范围匹配的像素设置为白色(即像素值为255),而将不匹配的像素设置为黑色(即像素值为0)。这个函数在图像处理中非常有用,特别是在需要根据颜色来分割图像时。

3. 运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

讯鹏PDA扫码机一维/二维条码扫描轻松应对各种应用场景

在数字化系统集成中,选择合适的PDA手持机至关重要。然而,市场上许多PDA手持机存在扫码不灵敏精度差、屏幕小、系统卡、可靠性弱、易损坏等问题,给用户带来诸多困扰。针对这些痛点,讯鹏推出了一款5.72寸全面屏手持扫码PDA&#xff…

Unity6 + UE5.4 PSO缓存实践记录

题图(取自COD冷战的着色器编译提示) PSO(管线状态对象 Pipeline State Object)是伴随现代图形API(DirectX12、Vulkan、Metal)而出现的概念,它本质上是单次绘制时渲染管线所处的状态信息的集合&…

滁州皖东农商银行新任董事长未得官宣,年报涉嫌泄露股东隐私

撰稿|芋圆 近期,滁州皖东农商银行发布2024年半年报,其2024年上半年营业收入4.7亿元,同比增长72%,成功实现扭亏为盈;净利润1.37亿元,同比上涨10%,增速显著提升。但其利息净收入1.4亿元&#xff…

梨花声音研修院退费普通话学习初级方法

普通话作为中国的官方语言和国家通用语言,学习和掌握普通话不仅对中国人至关重要,对世界各地的学习者也具有重要意义。无论是为了工作、学术、旅游还是文化交流,掌握普通话都能带来巨大的好处。以下是一些行之有效的普通话学习方法&#xff0…

PMP–一、二、三模–分类–14.敏捷–技巧–敏捷项目章程

文章目录 技巧一模14.敏捷--项目章程--产品意愿--是指产品负责人对产品未来前景和方向的一个高度概括描述,它应符合公司或组织的战略目标。产品愿景声明发送给项目团队中的每个人,保证团队都理解并认可产品愿景。64、 [单选] 在一次会议上,产…

PHP体检信息管理系统-计算机毕业设计源码54850

目录 1 绪论 1.1 选题背景 1.2选题意义 1.3研究的主要内容 1.4论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2…

线性代数|机器学习-P33卷积神经网络ImageNet和卷积规则

文章目录 1. ImageNet2. 卷积计算2.1 两个多项式卷积2.2 函数卷积2.3 循环卷积 3. 周期循环矩阵和非周期循环矩阵4. 循环卷积特征值4.1 卷积计算的分解4.2 运算量4.3 二维卷积公式 5. Kronecker Product 1. ImageNet ImageNet 的论文paper链接如下:详细请直接阅读相…

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"in…

奔驰 GLS450:后排电动遮阳帘升级,畅享私密与舒适

奔驰 GLS450&#xff1a;后排电动遮阳帘升级&#xff0c;畅享私密与舒适 奔驰 GLS450&#xff0c;作为豪华 SUV 的典范&#xff0c;一直致力于为乘客提供顶级的驾乘体验。此次升级后排电动遮阳帘&#xff0c;更是将舒适与私密提升到了新的高度。 升级后的电动遮阳帘&#xff…

第12章 第9节 Web应用测试(软件评测师)

1.web应用系统负载压力测试中&#xff0c;&#xff08;并发请求数&#xff09;不是衡量业务执行效率的指标。 【解析】并发请求数是考核系统能够承受的负载&#xff0c;交易执行吞吐量、交易执行相应时间、每秒点击率是衡量业务执行效率的指标 2.用户访问某web网站&#xff0…

你可能不知道的Activity启动的诡异现象探索

你可能不知道的Activity启动的诡异现象探索 这篇文章主要记录一下遇到的android启动过程中的一个有意思的探索过程&#xff0c;可能文章会比较长&#xff0c;相信我只要读下去一定会有所收获。这里说明一下&#xff0c;这篇文章肯定会涉及到activity的启动流程&#xff0c;很多…

JAVA社交新潮流同城组局搭子不愁系统小程序源码

社交新潮流——同城组局&#xff0c;搭子不愁系统 &#x1f389;【潮流前沿&#xff0c;社交新风向】&#x1f389; 在这个快节奏的城市生活中&#xff0c;你是否常常感到周末无聊&#xff0c;想找点乐子却苦于没有合适的搭子&#xff1f;别担心&#xff0c;今天我要给大家安…

【最经典的79个】软件测试面试题(内含答案)备战“金九银十”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

RPG经典设计逻辑——DD系统简单拆解

RPG经典设计逻辑——D&D系统简单拆解 作为TGA2023年度游戏&#xff0c;身披数十项奖项及提名的《博德之门3》&#xff0c;近日又获得了2024雨果奖“最佳游戏或交互式作品”的奖项。“雨果奖”之名源于“科幻杂志之父”雨果・根斯巴克&#xff0c;是科幻及奇幻领域最负盛名…

Mysql高阶语句(2)

Mysql视图&#xff1a;优化操作与安全方案 概述&#xff1a; 视图&#xff08;View&#xff09;是数据库中的一种虚拟表&#xff0c;虽然不包含实际数据&#xff0c;但可以映射真实数据&#xff0c;像是数据库表的镜花水月或倒影。视图会动态地保存结果集的数据&#xff0c;使…

springboot邮件发送的方式?如何配置服务?

Springboot邮件发送的优化策略&#xff1f;Springboot发信技巧&#xff1f; Spring Boot作为一个流行的Java框架&#xff0c;提供了简单而强大的方式来实现邮件发送功能。AokSend将详细介绍Spring Boot邮件发送的方式&#xff0c;帮助开发者快速掌握这一技能。 SpringBoot邮件…

跟我一起学Python编程(五),变量的定义和使用

今天给大家介绍一下Python变量的定义和使用&#xff0c;我们要使用编程语言去做一件事情&#xff0c;一定要使用到变量。 什么是变量&#xff1f; 在Python中&#xff0c;变量可以用来存储各种类型的数据&#xff0c;如数字&#xff0c;文本&#xff08;称为字符串&#xff09…

云计算之大数据(上)

目录 一、Elasticsearch 1.1 产品组件 1.1.1 X-Pack 1.1.2 Beats数据采集中心 1.1.3 Logstash 1.1.4 Kibana 1.2 架构特性 1.2.1 性能 1.2.2 安全性 1.2.3 可用性 1.2.4 可扩展性 1.2.5 可维护性 1.2.6 国际化 1.3 综合检索分析 1.4 全观测 1.5 大数据检索加速…

遗传算法与深度学习实战(5)——遗传算法中常用遗传算子

遗传算法与深度学习实战&#xff08;5&#xff09;——遗传算法中常用遗传算子 0. 前言1. 常用选择算子1.1 轮盘选择 (roulette wheel selection)1.2 随机遍历抽样 (Stochastic universal sampling, SUS)1.3 排序选择 (rank-based selection)1.4 适应度缩放选择&#xff08;Fit…

无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了

智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…