opencv实战项目十六:kmeans图像颜色聚类:

文章目录

  • 前言
  • K-means介绍
  • 效果


前言

在数字化时代,图像处理技术已成为计算机视觉领域的重要组成部分。其中,图像颜色聚类作为一项关键技术在众多应用场景中发挥着重要作用,如图像分割、物体识别、色彩调整等。K-means算法作为一种经典的聚类方法,以其简洁、高效的特点在图像颜色聚类领域得到了广泛应用。本文将围绕K-means图像颜色聚类技术,探讨其原理、实现方法以及在实际应用中的价值,为广大图像处理爱好者和技术人员提供参考。

K-means介绍

K-means算法是一种基于距离的聚类方法,它旨在将一组数据点划分为K个簇(Cluster),其中每个簇的内部数据点尽可能相似,而不同簇的数据点尽可能不同。
K-means算法的核心思想是通过迭代过程将数据点分配到K个簇中,使得每个数据点与其所属簇的中心点(均值)的距离之和最小。算法的步骤如下:

初始化: 随机选择K个数据点作为初始簇中心。
分配: 对于每个数据点,计算其与各个簇中心的距离,并将其分配到最近的簇中心所代表的簇。
更新: 重新计算每个簇的数据点的平均值,作为新的簇中心。
迭代: 重复步骤2和步骤3,直到满足停止条件,如簇中心的变化小于某个阈值或达到预设的迭代次数。

在opencv中集成了k-means方法,其函数为cv2.kmeans()函数介绍:
cv2.kmeans()函数是实现K-means聚类算法的一个高效工具。这个函数可以用于对数据进行聚类分析,特别是在图像处理中,它常用于颜色量化,即将图像中的颜色缩减到一定数量的聚类中心所代表的颜色。

retval, bestLabels, centers = cv2.kmeans(data, K, bestLabels, criteria, attempts, flags)
参数说明:
data: 一个浮点型数组,每一行代表一个样本,每一列代表一个特征。在图像颜色聚类中,通常是一个(N, 3)的数组,N是像素点的数量,3代表颜色通道(例如RGB)。
K: 聚类的数目,即我们想要将数据点划分成的簇的数量。
bestLabels: 输出数组,用于存储每个样本的簇索引。如果提供,则该数组将被用作初始标签,并且函数将使用这些标签进行优化。
criteria: 聚类算法的终止条件,这是一个包含三个元素的元组:type,max_iter,epsilon。
type:用于指定停止标准的类型,通常使用cv2.TERM_CRITERIA_EPS或cv2.TERM_CRITERIA_MAX_ITER,或者两者的组合。
max_iter:最大的迭代次数。
epsilon:所需的准确度。

attempts: 使用不同初始标签执行算法的次数,算法会返回最佳聚类的结果。
flags: 用于指定初始中心的选取方法,可以是cv2.KMEANS_PP_CENTERS或cv2.KMEANS_RANDOM_CENTERS。默认值为cv2.KMEANS_PP_CENTERS,它使用K-means++算法来选择初始中心,这通常比随机选择更有效。

返回值:

retval: 聚类中心之间的最小平方距离。
bestLabels: 每个样本的簇索引数组。
centers: 聚类中心的数组,每一行代表一个簇中心。

使用案例:

# 导入所需的库
import numpy as np
import cv2# 读取输入图像
img = cv2.imread(r'D:\ultralytics-main\1724896328042.png')
z = img.reshape((-1,3))# 转换为 np.float32
z = np.float32(z)# 定义标准,聚类的数量K并应用kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 2
ret,label,center=cv2.kmeans(z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)# 转换回uint8,并制作原始图像
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))# 显示图像
cv2.imshow('k = 2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:K=2可以实现图像二值化的效果,与传统二值化相比K-means算法在图像二值化中展现出其独特的优势,它能够根据图像内容的特征自适应地选择阈值,从而在处理不同光照条件和复杂背景的图像时,找到更合适的阈值,这一点相较于传统的全局阈值二值化方法更具灵活性。并且,K-means不仅考虑了像素间的相对关系,而且其不依赖于图像的特定统计特性,使得该方法适用于包括灰度图像和彩色图像在内的各种类型。然而,K-means图像二值化也存在局限性,如对初始聚类中心选择的敏感性,以及可能不适用于所有图像类型,特别是在处理非常嘈杂的图像时,可能需要额外的预处理来提升二值化的效果。

效果

原图:
在这里插入图片描述
二值化图:
在这里插入图片描述
可以看到没有收到阴影的影响,分割出比较干净的二值图片

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云游戏】点量云流赋能大型游戏新体验

点量小刘发现近期国产化大型3A游戏《黑神话:悟空》的发售,可谓是赢得了一波好评。从场景内容来说深厚的文化底蕴支撑和高质量精美的特效及画面制作令人眼前一亮,作为备受瞩目的一款游戏,从技术层面来说,该游戏也离不开…

【DSP+FPGA】基于DSP+FPGA XC7K325T与TMS320C6678的通用信号处理平台

DSP FPGA 协同处理架构板载 1 个TMS320C6678 多核DSP处理节点板载 1 片 XC7K325T FPGA处理节点板载 1 个FMC 接口板载4路SFP光纤接口FPGA 与 DSP 之间采用高速Rapid IO互联 基于FPGA与DSP协同处理架构的通用高性能实时信号处理平台,该平台采用1片TI的KeyStone系列多…

制造企业如何启用BI工具,并构建自助式BI业务模式?

在制造业的数字化转型浪潮中,商业智能BI工具正逐渐成为推动企业增长的“加速引擎”。随着数据量的爆炸性增长,如何高效地分析和利用数据,已成为制造业提升竞争力的关键。本文将基于BI工具在制造业中的优势,深入探讨一种创新的BI分…

[Meachines] [Insane] Bankrobber XSS-MDOG+SQLI+XSRF+Local-RCE+Bankv2转账模拟应用缓冲区溢出

信息收集 IP AddressOpening Ports10.10.10.154TCP:80,443,445,3306 $ nmap -p- 10.10.10.154 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http …

jenkins安装k8s插件发布服务

1、安装k8s插件 登录 Jenkins,系统管理→ 插件管理 → 搜索 kubernetes,选择第二个 Kubernetes,点击 安装,安装完成后重启 Jenkins 。 2、对接k8s集群、申请k8s凭据 因为 Jenkins 服务器在 kubernetes 集群之外,所以…

JVM垃圾回收算法:标记-清除算法 、复制算法、 标记-整理算法、 分代收集算法

文章目录 引言I 标记回收算法(Mark-Sweep)算法不足II 复制算法(Copying)III 标记整理算法(Mark-Compact)IV 分代收集(以上三种算法的集合体)内存划分新生代算法:Minor GC老年代算法V 查看JVM堆分配引言 垃圾回收(Garbage Collection,GC) Java支持内存动态分配、…

机器学习/数据分析案例---糖尿病预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 这是一篇数据分析/机器学习很好的入门案例,对糖尿病的影响进行预测和分析通过随机森林预测,平均准确率和召回率都不错不足&#x…

Pytorch实现多层LSTM模型,并增加emdedding、Dropout、权重共享等优化

简述 本文是 Pytorch封装简单RNN模型,进行中文训练及文本预测 一文的延申,主要做以下改动: 1.将nn.RNN替换为nn.LSTM,并设置多层LSTM: 既然使用pytorch了,自然不需要手动实现多层,注意nn.RNN…

Threejs之OrbitControls轨道控制器

本文目录 前言一、Orbitcontrols(轨道控制器)1.1 基础使用1.2 代码演示 二、效果展示 前言 Orbitcontrols(轨道控制器)可以使得相机围绕目标进行轨道运动。 一、Orbitcontrols(轨道控制器) 1.1 基础使用 C…

【Python 千题 —— 基础篇】身份证隐藏的信息

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 在一个用户信息管理系统中,你需要处理和验证用户提供的身份证号。编写一个程序来从用户信息字符串中提取和验证身份证号,并提供相应的处理方式…

图论----最小生成树讲解与相关题解

目前已更新系列 当前--图论----最小生成树讲解与相关题解 滑动窗口系列算法总结与题解一 算法系列----并查集总结于相关题解 图论---dfs系列 差分与前缀和总结与对应题解(之前笔试真的很爱考) 数论---质数判断、质因子分解、质数筛(埃氏…

在 Cilium CNI 集群上运行 vCluster 虚拟集群

上周在 KubeCon China 2024 大会上,我和社区伙伴们作为志愿者在 Cilium 项目展台与用户交流。有位用户询问 Cilium 是否能与 vCluster 集成,当时未能给出明确答复,特地回来后进行了测试。 答案是:在最新的 vCluster v0.20 中容器…

【Python篇】Python 类和对象:详细讲解(上篇)

文章目录 Python 类和对象:详细讲解1. 什么是类(Class)类的定义 2. 什么是对象(Object)创建对象 3. 属性和方法属性(Attributes)方法(Methods)在类中定义属性和方法使用对…

重生奇迹MU 小清新职业智弓MM

游戏中有一种令人迷醉的职业——智弓MM,她们以高超的射箭技能闻名于世。本文将为您介绍这个悠闲的小清新职业,在游戏中的特点以及如何成为一名出色的智弓MM。跟随我们一起探索这个奇妙而神秘的职业吧! 悠闲的游戏节奏是游戏的初衷之一&#…

52 mysql 启动过程中常见的相关报错信息

前言 我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题 这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题 但是 从来未曾思考过 这个问题到底是 怎么造成的 The server quit without updating PID fil…

【设计模式】创建型模式——抽象工厂模式

抽象工厂模式 1. 模式定义2. 模式结构3. 实现3.1 实现抽象产品接口3.2 定义具体产品3.3 定义抽象工厂接口3.4 定义具体工厂3.5 客户端代码 4. 模式分析4.1 抽象工厂模式退化为工厂方法模式4.2 工厂方法模式退化为简单工厂模式 5. 模式特点5.1 优点5.2 缺点 6. 适用场景6.1 需要…

用3点结构的s1顺序标定2点结构的s2顺序

在行列可自由变换的条件下,3点结构有6个 (A,B)---6*30*2---(0,1)(1,0) 让A分别是3a1,2,…,6,让B全是0。当收敛误差为7e-4,收敛199次取迭代次数平均值,得到 迭代 搜索难度 1 13913.2 1 2 …

客服系统简易版

整体架构解读 客服端和商城端都通过websocket连接到客服系统, 并定期维持心跳当客户接入客服系统时, 先根据策略选择在线客服, 然后再发送消息给客服 websocket实现 用netty实现websocket协议, 增加心跳处理的handler, 详见chat-server模块 客服路由规则 暂时仅支持轮询的…

视频结构化从入门到精通——视频结构化主要技术介绍

视频结构化主要技术 1 视频接入 “视频接入”是视频结构化管道的起点(SRC Point)视频接入是视频结构化处理的第一步,它涉及将视频数据从各种采集源获取到系统中进行进一步处理。视频接入的质量和稳定性对后续的数据处理、分析和应用至关重要…

【openwrt-21.02】T750 openwrt-21.02 Linux-5.4.238 input子系统----gpio-keys实现分析

input子系统 输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成 input子系统架构图 gpio-keys gpio-keys是基于input子系统实现的一个通用按键驱动,该驱动也符合linux驱动实现模型,即driver和device分离模型.一…