博客
关于我
图像分割系列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/

你可能感兴趣的文章
Openlayers实战:绘制图形,导出geojson文件
查看>>
Openlayers实战:绘制图形,导出KML文件
查看>>
Openlayers实战:绘制多边形,导出CSV文件
查看>>
Openlayers实战:绘制带箭头的线
查看>>
Openlayers实战:绘制点、线、圆、多边形
查看>>
Openlayers实战:绘制矩形,正方形,正六边形
查看>>
Openlayers实战:自定义放大缩小,显示zoom等级
查看>>
Openlayers实战:自定义版权属性信息
查看>>
Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
查看>>
Openlayers实战:选择feature,列表滑动,定位到相应的列表位置
查看>>
Openlayers实战:非4326,3857的投影
查看>>
Openlayers高级交互(1/20): 控制功能综合展示(版权、坐标显示、放缩、比例尺、测量等)
查看>>
Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
查看>>
Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
查看>>
Openlayers高级交互(12/20):利用高德逆地理编码,点击位置,显示坐标和地址
查看>>
Openlayers高级交互(13/20):选择左右两部分的地图内容,横向卷帘
查看>>
Openlayers高级交互(14/20):汽车移动轨迹动画(开始、暂停、结束)
查看>>
Openlayers高级交互(15/20):显示海量多边形,10ms加载完成
查看>>
Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
查看>>
Openlayers高级交互(17/20):通过坐标显示多边形,计算出最大幅宽
查看>>