52、基于K 均值聚类实现基于颜色的分割(matlab)

1、K 均值聚类实现基于颜色的分割原理及流程

K 均值聚类是一种常用的聚类算法,通过将数据点分配到 K 个簇中,每个簇的中心代表簇的平均值来实现聚类的目的。

基于颜色的分割的原理是利用像素的颜色信息来对图像进行分割。首先需要将图像的每个像素点表示为一个特征向量,可以选择 RGB 颜色空间中的颜色分量作为特征向量。然后将这些特征向量作为输入数据,使用 K 均值聚类算法来对图像进行分割。

流程如下:

  1. 初始化 K 个聚类中心,可以随机选择 K 个像素点的颜色作为初始聚类中心。
  2. 对每个像素点计算其到每个聚类中心的距离,将其分配到距离最近的聚类中心所代表的簇中。
  3. 更新每个聚类的中心,即计算每个簇中所有像素点的平均值,并将该平均值作为新的聚类中心。
  4. 重复步骤 2 和 3 直到满足停止条件,如聚类中心不再发生变化或达到指定的迭代次数。
  5. 最终得到 K 个簇,每个簇代表一个颜色分割区域。

通过 K 均值聚类算法实现基于颜色的分割可以将图像分成具有相似颜色的区域,从而实现图像的分割和聚类任务。

2、 K 均值聚类实现基于颜色的分割说明

1)方案

使用 K 均值聚类自动分割颜色

2)简介

聚类是一种分离对象组的方法。K 均值聚类将每个对象视为在空间中有一个位置。它将对象划分为若干分区,使每个簇中的对象尽可能彼此靠近,并尽可能远离其他簇中的对象。

使用 imsegkmeans 函数将图像像素按值分成一个颜色空间内的若干个簇。  

RGB 和 L*a*b* 颜色空间中执行图像的k 均值聚类,以显示使用不同颜色空间如何改进分割结果。

3、读取图片(彩色图片)

代码

he = imread("CT1.png");
imshow(he)
title("H&E Image")

视图效果

4、用 K 均值聚类对 RGB 颜色空间的颜色进行分类

1)说明

在 RGB 颜色空间中使用 k 均值聚类将图像分割成三个区域。对于输入图像中的每个像素,imsegkmeans 函数返回一个对应的簇标签。
将标注图像叠加显示在原始图像上。
标注图像将白色、浅蓝-紫色和浅粉色区域组合在一起,这是不正确的由于 RGB 颜色空间合并了每个通道(红、绿、蓝)内的亮度和颜色信息,因此两种不同颜色的较亮版本比这两种颜色的较暗版本更接近,也更难分割。

代码

numColors = 3;
L = imsegkmeans(he,numColors);
B = labeloverlay(he,L);
imshow(B)
title("K均值聚类效果")

视图效果

 

 5、将图像从 RGB 颜色空间转换为 L*a*b* 颜色空间

1)说明

使用 rgb2lab 函数将图像转换为 L*a*b* 颜色空间。

L*a*b* 颜色空间将图像的光度和颜色分开。这使得按颜色分割区域变得更加容易并且与亮度无关。颜色空间也更符合人类对图像中不同的白色、蓝-紫色和粉色区域的视觉感知。
L*a*b* 颜色空间是从 CIE XYZ 三色值派生的。L*a*b* 空间包含光度层 L*、色度层 a*(表示颜色落在沿红-绿轴的位置)和色度层 b*(表示颜色落在沿蓝-黄轴的位置)。所有颜色信息都在 a* 和 b* 层。


代码

lab_he = rgb2lab(he);

 6、用 K 均值聚类对基于 a*b* 空间的颜色进行分类

1)说明

仅使用颜色信息分割图像,请将图像限制为 lab_he 中的 a* 和 b* 值。
将图像转换为 single 数据类型,以便于 imsegkmeans 函数使用。使用 imsegkmeans 函数将图像像素分成三个簇。将 NumAttempts 名称-值参数的值设置为使用不同的初始簇质心位置重复聚类三次,以避免拟合局部最小值。

2)imsegkmeans()基于 K 均值聚类的图像分割

语法

L = imsegkmeans(I,k) 通过执行 k 均值聚类将图像 I 分割成 k 个簇,并在 L 中返回分割后带标签的输出。

[L,centers] = imsegkmeans(I,k) 还返回簇质心位置 centers

L = imsegkmeans(I,k,Name,Value) 使用名称-值参数来控制 k 均值聚类算法的各个方面。

代码

ab = lab_he(:,:,2:3);
ab = im2single(ab);
pixel_labels = imsegkmeans(ab,numColors,"NumAttempts",4);
%标注图像叠加显示在原始图像上。新标注图像将白色、蓝紫色和粉色染色组织区域更清晰地区分开来。
figure(2)
B2 = labeloverlay(he,pixel_labels);
imshow(B2)
title("聚类四次")

视图效果

 7、创建按颜色分割 H&E 图像的图像

使用 pixel_labels,按颜色分离原始图像中的对象,从而产生三个掩膜图像

1)掩膜图像1代码

figure(3)
mask1 = pixel_labels == 1;
cluster1 = he.*uint8(mask1);
imshow(cluster1)
title("按颜色分割 H&E 图像1");

视图效果

2)掩膜图像2代码 

figure(4)
mask2 = pixel_labels == 2;
cluster2 = he.*uint8(mask2);
imshow(cluster2)
title("按颜色分割 H&E 图像2");

视图效果

3)掩膜图像3代码  

figure(5)
mask3 = pixel_labels == 3;
cluster3 = he.*uint8(mask3);
imshow(cluster3)
title("按颜色分割 H&E 图像3");

视图效果

8、总结

基于K均值聚类实现基于颜色的分割的步骤可以总结为:

  1. 读取图像:首先需要使用MATLAB中的imread函数读取要进行颜色分割的图像。

  2. 特征向量表示:将图像中的每个像素点表示为一个特征向量,通常选择在RGB颜色空间中的颜色分量作为特征向量。

  3. 初始化聚类中心:随机选择K个像素点的颜色作为初始聚类中心。

  4. 分配像素点到簇:计算每个像素点到每个聚类中心的距离,并将其分配到距离最近的聚类中心所代表的簇中。

  5. 更新聚类中心:计算每个簇中所有像素点的平均值,并将该平均值作为新的聚类中心。

  6. 重复更新和分配直到满足停止条件:重复步骤4和5直到聚类中心不再发生变化或达到指定的迭代次数。

  7. 可视化分割结果:根据最终的聚类中心,将图像的像素点重新分配颜色,从而实现基于颜色的图像分割。

在MATLAB中,可以使用自带的kmeans函数来实现K均值聚类,具体操作可以参考MATLAB官方文档和相关教程。

9、源代码

代码

%% K 均值聚类实现基于颜色的分割
%使用 K 均值聚类自动分割颜色。
%聚类是一种分离对象组的方法。K 均值聚类将每个对象视为在空间中有一个位置。它将对象划分为若干分区,使每个簇中的对象尽可能彼此靠近,
%并尽可能远离其他簇中的对象。使用 imsegkmeans 函数将图像像素按值分成一个颜色空间内的若干个簇。 RGB 和 L*a*b* 颜色空间中执行图像的
%k 均值聚类,以显示使用不同颜色空间如何改进分割结果。
%% 读取图片(彩色图片)
he = imread("CT1.png");
imshow(he)
title("H&E Image")
%% 用 K 均值聚类对 RGB 颜色空间的颜色进行分类
%在 RGB 颜色空间中使用 k 均值聚类将图像分割成三个区域。对于输入图像中的每个像素,imsegkmeans 函数返回一个对应的簇标签。
%将标注图像叠加显示在原始图像上。
%标注图像将白色、浅蓝-紫色和浅粉色区域组合在一起,这是不正确的。由于 RGB 颜色空间合并了每个通道(红、绿、蓝)内的亮度和颜色信息,因此两种不同颜色的较亮版本比这两种颜色的较暗版本更接近,也更难分割。
numColors = 3;
L = imsegkmeans(he,numColors);
B = labeloverlay(he,L);
imshow(B)
title("K均值聚类效果")
%% 将图像从 RGB 颜色空间转换为 L*a*b* 颜色空间
%使用 rgb2lab 函数将图像转换为 L*a*b* 颜色空间。
%L*a*b* 颜色空间将图像的光度和颜色分开。这使得按颜色分割区域变得更加容易并且与亮度无关。颜色空间也更符合人类对图像中不同的白色、蓝-紫色和粉色区域的视觉感知。
%L*a*b* 颜色空间是从 CIE XYZ 三色值派生的。L*a*b* 空间包含光度层 L*、色度层 a*(表示颜色落在沿红-绿轴的位置)和色度层 b*(表示颜色落在沿蓝-黄轴的位置)。所有颜色信息都在 a* 和 b* 层。
lab_he = rgb2lab(he);
%% 用 K 均值聚类对基于 a*b* 空间的颜色进行分类
%仅使用颜色信息分割图像,请将图像限制为 lab_he 中的 a* 和 b* 值。
%将图像转换为 single 数据类型,以便于 imsegkmeans 函数使用。使用 imsegkmeans 函数将图像像素分成三个簇。将 NumAttempts 名称-值参数的值设置为使用不同的初始簇质心位置重复聚类三次,以避免拟合局部最小值。ab = lab_he(:,:,2:3);
ab = im2single(ab);
pixel_labels = imsegkmeans(ab,numColors,"NumAttempts",4);
%标注图像叠加显示在原始图像上。新标注图像将白色、蓝紫色和粉色染色组织区域更清晰地区分开来。
figure(2)
B2 = labeloverlay(he,pixel_labels);
imshow(B2)
title("聚类四次")
%% 创建按颜色分割 H&E 图像的图像
%使用 pixel_labels,按颜色分离原始图像中的对象,从而产生三个掩膜图像
figure(3)
mask1 = pixel_labels == 1;
cluster1 = he.*uint8(mask1);
imshow(cluster1)
title("按颜色分割 H&E 图像1");figure(4)
mask2 = pixel_labels == 2;
cluster2 = he.*uint8(mask2);
imshow(cluster2)
title("按颜色分割 H&E 图像2");figure(5)
mask3 = pixel_labels == 3;
cluster3 = he.*uint8(mask3);
imshow(cluster3)
title("按颜色分割 H&E 图像3");

工程文件

https://download.csdn.net/download/XU157303764/89494538

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

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

相关文章

计算机网络微课堂(湖科大教书匠)TCP部分

计算机网络微课堂(湖科大教书匠)TCP部分 【计算机网络微课堂(有字幕无背景音乐版)】 TCP的流量控制 一般来说,我们希望数据传输得更快一些。但如果发送方把数据发送得过快,接收方就可能来不及接收&#…

KV260视觉AI套件--开箱报告

目录 1. 简介 2. 与 Zynq 的渊源 3. 官方的入门步骤 4. 总结 1. 简介 传统的ARMFPGA或DSPFPGA控制方案在软件、逻辑、硬件以及系统工程的协同调试中,往往需要团队成员之间严格按照预定计划和接口规范进行分工合作,这不仅增加了测试过程的复杂性&…

《概率论与数理统计》期末复习笔记_上

目录 第1章 随机事件与概率 1.1 随机事件 1.2 事件的关系与运算 1.3 概率的定义与性质 1.4 古典概型_重点 1.5 几何概型 1.6 条件概率与乘法公式 1.7 全概率公式与贝叶斯公式_重点 1.8 事件的独立性_重点 1.9 伯努利概型_重难点 第2章 随机变量及其分布 2.1 随机变…

实验2 色彩模式转换

1. 实验目的 ①了解常用的色彩模式,理解色彩模式转换原理; ②掌握Photoshop中常用的颜色管理工具和色彩模式转换方法; ③掌握使用Matlab/PythonOpenCV编程实现色彩模式转换的方法。 2. 实验内容 ①使用Photoshop中的颜色管理工具&#xff…

第0章_项目方案介绍

文章目录 第0章 项目方案介绍0.1 功能介绍0.2 硬件方案0.3 软件方案0.3.1 上位机方案0.3.2 **中控方案**0.3.3 **传感器方案**0.3.4 **技术难点** 第0章 项目方案介绍 0.1 功能介绍 本课程来自一个真实项目:多个气体传感器的管理。由于气体传感器比较昂贵&#xf…

比尔盖茨:Agent将是AI最大的赛道

Agent不仅将改变人们与计算机的互动方式,还将颠覆软件行业,引发自从我们从键入命令到点击图标以来计算机领域的最大革命。 保罗艾伦和我一起创立微软的至今,我对软件的热爱至今依然不减。 然而,尽管在过去的几十年中软件已经取得…

Vue.js 和 Node.js 全栈项目的运行与部署指南

Vue.js 和 Node.js 全栈项目的运行与部署指南 前言具体运行方式导入数据库初始化安装配置nodejs启动server后端启动client前端确保前后端正确连接 前言 本博客用来介绍一下一个包含前端和后端代码的全栈项目MoreMall,前端部分使用了 Vue.js,后端部分使用…

多阶段分层构建容器化Spring Boot应用程序

上一节中,容器化spring boot应用程序-CSDN博客我们介绍了基于简单的Dockerfile对spring boot进行容器化的过程,本讲将介绍如何基于Dockerfile进行多阶段的分层构建过程,希望对大家有所帮助。 Spring Boot从版本2.3.0开始支持分层构建容器化的…

Mysql中varchar类型数字排序不对踩坑记录

场景 在进行表设计时将版本号字段设计了为varchar类型,尽量从表设计阶段将数字类型列设计为int型。 再进行排序时如果版本号累计到了10及以上,那么再进行排序时则会出现问题。 比如下面执行排序时发现10被排在了第一位。 这是因为 varchar类型对数字…

已备案网站变更并且不影响现有业务的方案

已备案网站变更并且不影响现有业务的方案 近日有个工作上的需求,已备案网站变更并且不影响现有业务,记录一下。 需求 域名:XXXXXX.com备案变更前主体: 海南XXXXXX科技有限公司 备案变更后主体: 深圳XXXXXX科技有限…

【05】从0到1构建AI生成思维导图应用 -- 前端交互实现

【05】从0到1构建AI生成思维导图应用 – 前端交互实现 大家好!最近自己做了一个完全免费的AI生成思维导图的网站,支持下载,编辑和对接微信公众号,可以在这里体验:https://lt2mind.zeabur.app/ 上一章:http…

【图解大数据技术】Hive、HBase

【图解大数据技术】Hive、HBase Hive数据仓库Hive的执行流程Hive架构数据导入Hive HBaseHBase简介HBase架构HBase的列式存储HBase建表流程HBase数据写入流程HBase数据读取流程 Hive Hive是基于Hadoop的一个数据仓库工具,Hive的数据存储在HDFS上,底层基于…

容器进程

一、容器进程和宿主机进程的关系 容器在进程空间上和宿主机是隔离的,每创建一个容器,该容器都有一个独属的进程空间简称PID NameSpace。但是容器本质也是一个进程,自然是由其父进程创建的,这个可以使用ps aux命令验证。 | 容器视…

Tesseract Python 图片文字识别入门

1、安装tesseract Index of /tesseract https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-w64-setup-v5.3.0.20221214.exe 2、安装中文语言包 https://digi.bib.uni-mannheim.de/tesseract/tessdata_fast/ 拷贝到C:\Program Files\Tesseract-OCR\tessdata 3、注…

ISO26262标准

什么是ISO26262? ISO 26262(国际功能安全标准)是一个涵盖整个汽车产品开发过程的汽车功能安全标准。ISO 26262继承或改编自工业自动化行业的安全要求标准IEC61508,但专门为汽车行业量身定制。最新版本是ISO26262-1:2018。 它包括诸如需求分析、安全分析…

STM32CubeMx的学习记录系列(2)- STM32G474RET6

最近有个小比赛,需要用到G4,不过找了一圈没有找到标准库的代码,只能使用hal,用CubeMX来生成配置代码。 共同特点 ARDUINO Uno V3 扩展连接器 ST morpho 扩展引脚接头,可完全访问所有 STM32 I/O 采用LQFP64或LQFP48封…

2-requests模块(6节课学会爬虫)

2-requests模块(6节课学会爬虫) 1,安装requests2,发送get,post请求,获取响应3,response的方法方法一(Response.text)方法二(response.content.decode()&#…

Docker 查看源地址/仓库地址,更改

一、源地址文件配置路径。若有docker文件夹,没有json,可以新增,复制进去内容 /etc/docker/daemon.json {"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com",&q…

【数据分析】1、用Pandas计算数据相关性系数

相关性系数和相关分析是了解变量之间关系的重要工具。通过合理选择相关性系数和科学分析数据,能够有效揭示变量之间的关系,为进一步研究和决策提供有力支持。在实际应用中,应结合业务背景、数据特性和统计原则,谨慎解释和应用相关…

【小学期】常用基于Swing的七个静态界面

示例1:基本的带按钮和标签的界面 import javax.swing.*; import java.awt.*;public class SimpleSwingApp1 {public static void main(String[] args) {JFrame frame new JFrame("Simple Swing App 1");frame.setDefaultCloseOperation(JFrame.EXIT_ON_C…