博客
关于我
图像分割系列3_KMeans对图像进行分割
阅读量:692 次
发布时间:2019-03-17

本文共 939 字,大约阅读时间需要 3 分钟。

KMeans图像分割是一种常见的无监督学习技术,可以用来将一张图像分割成多个具有同质性的区域。以下将详细介绍基于OpenCV实现的KMeans图像分割的方法。

首先,我们需要初始化一些参数。颜色表colorTab包含了一些常见的颜色,可以用来对图像进行分类。colorTab数组中的每个元素代表一种颜色,BGR色空间模式。需要注意的是,这里的颜色与图片中的实际颜色有一定的差距,需要根据具体需求进行调整。

接下来,我们获取图像的尺寸。宽度由cols决定,高度由rows决定, dims则表示图像的通道数。为了实现KMeans,我们需要先创建一个包含所有像素的样本点矩阵points。每个像素都会映射为一个点,点的维度和通道数一致。

初始时,我们还需要创建一个用于存储样本标签的矩阵labels以及每个簇的中心点矩阵centers。label的值表示每个像素属于哪个簇,中心点的数目由clusterCount决定。在这个实例中,clusterCount设置为4,这是最常见的簇的数量。

为了获得每个像素的坐标,我们遍历整个图像。在这个循环中,我们获取每个像素的BGR颜色值,并将其存储在points矩阵中。需要注意的是,points矩阵的 Storage Order 是按行优先的顺序存储的,先存储上边缘,然后是下边缘。

完成样本点矩阵的初始化之后,我们可以调用KMeans算法。在这里,TermCriteria用于设置终止条件。第一个参数设置为EPS和COUNT,意味着算法在一定的次数(10次)和终止误差(0.1)下停止迭代。第二个参数设置为3,表示最多运行3次KMeans算法。KMEANS_PP_CENTERS参数指定了算法返回中心点的方式。由于我们已经预先定义了centers矩阵,这里设置为KMEANS_PP_CENTERS以确保算法返回预定义的中心点。

得到标签之后,我们需要将这些标签映射到颜色表中。具体来说,我们为每个像素获取对应的标签,选择颜色表中的相应颜色,并将这个颜色赋给对应位置的像素。通过这种方式,可以将整个图像按颜色分割成不同的区域。

最后,我们可以 显示生成的图像,检查KMeans算法的性能。为了更好地调试和观察结果,可以设置成自动调节窗口大小。

转载地址:http://qzuhz.baihongyu.com/

你可能感兴趣的文章
Vue过渡 & 动画---vue工作笔记0014
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty 的 Handler 链调用机制
查看>>
Netty 编解码器详解
查看>>
Netty 解决TCP粘包/半包使用
查看>>
Netty 调用,效率这么低还用啥?
查看>>
Netty+Protostuff实现单机压测秒级接收35万个对象实践经验分享
查看>>
Netty+SpringBoot+FastDFS+Html5实现聊天App详解(一)
查看>>
netty--helloword程序
查看>>
Netty5.x 和3.x、4.x的区别及注意事项(官方翻译)
查看>>
netty——bytebuf的创建、内存分配与池化、组成、扩容规则、写入读取、内存回收、零拷贝
查看>>
netty——Channl的常用方法、ChannelFuture、CloseFuture
查看>>
netty——EventLoop概念、处理普通任务定时任务、处理io事件、EventLoopGroup
查看>>
netty——Future和Promise的使用 线程间的通信
查看>>
netty——Handler和pipeline
查看>>
Vue输出HTML
查看>>
netty——黏包半包的解决方案、滑动窗口的概念
查看>>
Netty中Http客户端、服务端的编解码器
查看>>
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
查看>>
Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)
查看>>