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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】--操作符详解

🌭个人主页: 起名字真南 🍿个人专栏:【数据结构初阶】 【C语言】 目录 1 算术操作符1.1 和 -1.2 *1.3 /1.4 % 2 赋值操作符 :2.1 复合赋值符 3 单目操作符3.1 和- - 4 强制类型转换5 printf 和 scanf5.1 printf5.1.1 基本用法5.1.2 占位符5.…

AI 音乐生成器 MusicGPT,同声传译StreamSpeech!Web短视频平台Sharine

AI 音乐生成器 MusicGPT,同声传译StreamSpeech!Web短视频平台Sharine。 项目简介 MusicGPT 是一款应用程序,允许在任何平台上以高性能方式本地运行最新的音乐生成 AI 模型,而无需安装 Python 或机器学习框架等严重依赖项。 目前它仅支持 Me…

MySQL中的存储引擎

介绍 存储引擎就是存储数据,建立索引,更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可以称为表类型(即一个数据库下的表可以选择不同的存储引擎)。 1. 如何查看一个…

一些指标的学习

1.平均倒数排名(MRR) 1.定义 MRR 是衡量检索系统返回的结果列表中第一个相关结果位置的指标。具体来说,它是所有查询倒数排名的平均值。 2.计算步骤 对每个查询,找到第一个正确答案在结果列表中的排名 𝑅&#x1d44…

Python数据库数据的读取

数据库数据的读取 绝大多数公司都会选择将数据存入数据库中,因为数据库既可以存放海量数据,又可以非常便捷地实现数据的查询。本节将以MySQL和SQL Server为例,教会读者如何使用Pandas模块和对应的数据库模块(分别是pymysql模块和…

金融科技:重塑用户体验,驱动满意度飙升

随着科技的飞速发展,金融科技(FinTech)已经深入到我们生活的每一个角落,从日常支付到投资理财,再到跨境汇款,它都在悄无声息地改变着我们的金融行为。而在这背后一个不可忽视的驱动力就是金融科技对用户体验…

短视频视频配:成都柏煜文化传媒有限公司

短视频视频配:​艺术与技术的完美融合 在短视频盛行的当下,一个优秀的短视频作品不仅仅依赖于精彩的内容,更需要在视频配上做足功夫。视频配,作为短视频的重要组成部分,涵盖了音效、配乐、字幕等多个方面,…

Camera Raw:编辑 - 曲线

Camera Raw “编辑”模块中的曲线 Curve面板提供了曲线这一强大的工具,通过精确控制亮度和对比度,以及调整红、绿、蓝通道的曲线,可以显著提升图像的视觉效果和色彩表现。这些调整工具为摄影师和图像编辑者提供了丰富的创意可能性&#xff0c…

ORB-SLAM2同OpenMVS实现三维重建

ORB-SLAM2 位姿导出 Note: 为与OpenMVS进行对接本次进对ORB-SLAM2进行部分修改,使之可以为 OpenMVS提供稀疏点云、关键帧的位姿、内参,以及稀疏点云在各个View 中的可见性。 主要更改如下 . 在Map文件下增添如下函数 public: void Save(const string &a…

Vue+Proj4Leaflet实现地图瓦片(Nginx代理本地地图瓦片为网络url)加载并实现CRS投影转换(附资源下载)

场景 Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件): Leaflet中加载离线OSM瓦片地图(使用OfflineMapMaker切割下载离线png地图文件)_offline map maker-CSDN博客 Leaflet快速入门与加载OSM显示地图: Leaflet快速入门与…

spring aop 初探

org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary 分析JDK动态代理 生成的代理对象 构造函数,入参为 InvocationHandler public com.sun.proxy.$Proxy164(java.lang.reflect.InvocationHandler) 生成动态代理Class对象&…

Android 遥控器

遥控器源码 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RadialGradient; import android.graphics.Region; import android.g…

JavaScript(2)——输入输出和执行顺序

目录 JS的输入输出语法 输出: 输入 JS的代码执行顺序 字面量 JS的输入输出语法 输出: document.write(内容)alert(内容) 页面弹出警告框console.log(内容) 控制台输出语法,程序员调试使用 作用:向body输出内容 注意&…

Node.js简介

一:Node.js简介 Node.js是一个跨平台的JavaScript运行环境,使开发者可以搭建服务器端的JavaScript应用程序 作用:使用Node.js编写服务器端程序 编写数据接口,提供网页资源浏览功能有利于前端工程化,可以集成各种开发…

等保测评练习卷14

等级保护初级测评师试题14 姓名: 成绩: 判断题(10110分) 1. 方案编制活动中测评对象确定、测评指…

【python】OpenCV—Aruco

文章目录 Detect ArucoGuess Aruco Type Detect Aruco 学习参考来自:OpenCV基础(19)使用 OpenCV 和 Python 检测 ArUco 标记 更多使用细节可以参考:【python】OpenCV—Color Correction 源码: 链接:http…

在 UBUNTU 22.04 上逐步构建 Postal SMTP 服务器

构建 Postal SMTP 服务器来发送批量电子邮件是电子邮件营销人员的不错选择。Postal 功能非常强大,并拥有大量开发人员的支持。它是一个用 JavaScript 和 Ruby 编写的开源邮件服务器脚本。它可用于构建内部 SMTP 服务器,就像 Mailgun、Sendgrid、Mailchim…

【期末速成】计算机操作系统 EP03 | 学习笔记

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️2.1 考点五:进程的概念及特征2.1 考点六:进程的状态与切换 三、总结:🍓🍓🍓 一、前言🚀&#x1f6…

Why is Kafka fast?(Kafka性能基石)

Kafka概述 Why is kafka fast? 思考一下,当我们在讨论Kafka快的时候我们是在谈论什么呢?What does it even mean that Kafka is fast? 我们是在谈论kafka的低延迟(low latency)还是在讨论吞吐量(through…

快速了解GPT-4o和GPT-4区别

GPT-4o简介 在5月14日的OpenAI举行春季发布会上,OpenAI在活动中发布了新旗舰模型“GPT-4o”!据OpenAI首席技术官穆里穆拉蒂(Muri Murati)介绍,GPT-4o在继承GPT-4强大智能的同时,进一步提升了文本、图像及语…