存在需要解决的问题:

1、kmean是随机聚类的,当设置K值后,每次聚类完后分配的标签也是随机的,如果直接根据聚类后的标签给着色,客户每一次聚类后发现颜色都跟上一次不一样,又开始哔哩哔哩了;

2、可通过设置kmean的参数cv2.KMEANS_USE_INITIAL_LABELS,可一定程度上降低每次运行后标签变动太大,但不能彻底解决这个问题;

3、可通过改变kmean聚类的标签来实现,每次在标签图上着色的颜色位置都是固定的。

简单的方案:(1)对聚类标签的数量进行统计,按占比例大小进行从小到大排序;

(2)对原聚类的标签使用排序后的索引进行强制打标签;

存在问题:每次运行kmean聚类后,着色颜色基本上能稳定,但是还是偶尔会变。

numpy获取数组下标:

index = np.argsort(ratio)

numpy根据两组数据创建字典:

dic = dict(zip(rt,ratio))
import cv2
import numpy as npimport pydensecrf.densecrf as dcrf
try:from cv2 import imread, imwrite
except ImportError:# 如果没有安装OpenCV,就是用skimagefrom skimage.io import imread, imsaveimwrite = imsave
from pydensecrf.utils import unary_from_labels, create_pairwise_bilateral, create_pairwise_gaussianblue = [255, 20, 20]    #蓝色
green = [50, 255, 50]   #绿色
red = [50, 50, 255]     #红色
light_green = [255, 255, 128] #青色
white = [50, 255, 255] #橙色#颜色字典
color_dit = np.array([blue, green, red, light_green, white])#标签着色函数
def decode_segmap(predit_map,color_map,num_class):img = predit_map[:, :, 0] if len(predit_map.shape) == 3 else predit_mapimg_out = np.zeros(img.shape +(3,))if num_class > len(color_map):num_class = len(color_map)for i in range(num_class):img_out[img == i,:] = color_dit[i]return img_outdef CRFs(original_image_path, predicted_image_path, CRF_image_path):img = original_image_path# 将predicted_image的RGB颜色转换为uint32颜色 0xbbggrranno_rgb = predicted_image_path.astype(np.uint32)anno_lbl = anno_rgb[:, :, 0] + (anno_rgb[:, :, 1] << 8) + (anno_rgb[:, :, 2] << 16)# 将uint32颜色转换为1,2,...colors, labels = np.unique(anno_lbl, return_inverse=True)# 如果你的predicted_image里的黑色(0值)不是待分类类别,表示不确定区域,即将分为其他类别# 那么就取消注释以下代码# HAS_UNK = 0 in colors# if HAS_UNK:# colors = colors[1:]# 创建从predicted_image到32位整数颜色的映射。colorize = np.empty((len(colors), 3), np.uint8)colorize[:, 0] = (colors & 0x0000FF)colorize[:, 1] = (colors & 0x00FF00) >> 8colorize[:, 2] = (colors & 0xFF0000) >> 16# 计算predicted_image中的类数。n_labels = len(set(labels.flat))# n_labels = len(set(labels.flat)) - int(HAS_UNK) ##如果有不确定区域,用这一行代码替换上一行##############################     设置CRF模型     ##############################use_2d = False# use_2d = True#############################################################不是很清楚什么情况用2D##作者说“对于图像,使用此库的最简单方法是使用DenseCRF2D类”##作者还说“DenseCRF类可用于通用(非二维)密集CRF”##但是根据我的测试结果一般情况用DenseCRF比较对#########################################################33if use_2d:# 使用densecrf2d类d = dcrf.DenseCRF2D(img.shape[1], img.shape[0], n_labels)# 得到一元势(负对数概率)U = unary_from_labels(labels, n_labels, gt_prob=0.2, zero_unsure=None)# U = unary_from_labels(labels, n_labels, gt_prob=0.2, zero_unsure=HAS_UNK)## 如果有不确定区域,用这一行代码替换上一行d.setUnaryEnergy(U)# 增加了与颜色无关的术语,功能只是位置而已d.addPairwiseGaussian(sxy=(3, 3), compat=3, kernel=dcrf.DIAG_KERNEL,normalization=dcrf.NORMALIZE_SYMMETRIC)# 增加了颜色相关术语,即特征是(x,y,r,g,b)d.addPairwiseBilateral(sxy=(80, 80), srgb=(13, 13, 13), rgbim=img, compat=10,kernel=dcrf.DIAG_KERNEL,normalization=dcrf.NORMALIZE_SYMMETRIC)else:# 使用densecrf类d = dcrf.DenseCRF(img.shape[1] * img.shape[0], n_labels)# 得到一元势(负对数概率)U = unary_from_labels(labels, n_labels, gt_prob=0.7, zero_unsure=None)# U = unary_from_labels(labels, n_labels, gt_prob=0.7, zero_unsure=HAS_UNK)## 如果有不确定区域,用这一行代码替换上一行d.setUnaryEnergy(U)# 这将创建与颜色无关的功能,然后将它们添加到CRF中feats = create_pairwise_gaussian(sdims=(3, 3), shape=img.shape[:2])d.addPairwiseEnergy(feats, compat=3, kernel=dcrf.DIAG_KERNEL,normalization=dcrf.NORMALIZE_SYMMETRIC)# 这将创建与颜色相关的功能,然后将它们添加到CRF中feats = create_pairwise_bilateral(sdims=(80, 80), schan=(13, 13, 13),img=img, chdim=2)d.addPairwiseEnergy(feats, compat=10,kernel=dcrf.DIAG_KERNEL,normalization=dcrf.NORMALIZE_SYMMETRIC)#######################################         做推理和计算         ######################################## 进行5次推理Q = d.inference(20)# 找出每个像素最可能的类MAP = np.argmax(Q, axis=0)# 将predicted_image转换回相应的颜色并保存图像MAP = colorize[MAP, :]#imwrite(CRF_image_path, MAP.reshape(img.shape))return MAP.reshape(img.shape)''''
算法调用函数入库
参数image,表示需要进行聚类的图像
参数k,表示keams的K值,默认大小为5
'''
def segment_kmeans_color_(image,k=5):height, weight,_ = image.shapeimage_copy = image.copy()# 3个通道展平img_flat = image_copy.reshape((image.shape[0] * image.shape[1], 3))img_flat = np.float32(img_flat)# kmean聚类参数criteria = (cv2.TERM_CRITERIA_EPS + cv2.TermCriteria_MAX_ITER, 200, 0.5)flags = cv2.KMEANS_USE_INITIAL_LABELS# 聚类compactness, labels, centers = cv2.kmeans(img_flat, k, None, criteria, 20, flags)#把聚类标签还原为原图的shapelabels = labels.reshape(height, weight)#获取聚类族群的个数cluster = centers.shape[0]#统计聚类后每一类占整个图像像素的比例值ratio = []for i in range(cluster):ratio.append(len(labels[labels==i]) / (height * weight))#获取从小到大排列的比例值在ratio中的索引值,即标签值index = np.argsort(ratio)#由于kmean聚类后分配标签并不是按照类别在原图所占比例大小进行分配的,所以这里进行标签更正#以聚类后所占原图比例进行从小到大分配标签correct_label = np.zeros(labels.shape)for i in range(cluster):correct_label[labels==index[i]]=i#构造字典rt = []for k in range(cluster):rt.append('ratio' + str(k))ratio.sort()dic = dict(zip(rt,ratio))#对标签进行着色color_labels = decode_segmap(correct_label,centers, centers.shape[0])#使用条件随机场对分割进行后处理color_labels = CRFs(image,color_labels,None)#把分割彩色图和原图进行融合image_res = cv2.addWeighted(image, 1, color_labels, 0.35, 0)cv2.imshow("image", image_res)dic['image'] = image_resreturn dicif __name__ == '__main__':for i in range(5):image = cv2.imread('G:\\Data\\segment\\20200529165615.png', cv2.IMREAD_COLOR)k =5res = segment_kmeans_color_(image,k)cv2.waitKey(0)

使用kmean进行图像分割 使用CRFs进行分割后处理相关推荐

  1. 图像处理(三)图像分割(1)Random Walks分割

    基于随机游走的图像分割算法 基于随机游走的图像分割算法是属于图论分割方法中的一种,这个算法比较偏,网上的paper比较少,刚开始学习找个资料都不容易,其实这个算法的原理就是通过求解一个邻接矩阵方程组, ...

  2. CV之IS:计算机视觉之图像分割(Image Segmentation)/语义分割算法的简介、使用方法、案例应用之详细攻略

    CV之IS:计算机视觉之图像分割(Image Segmentation)/语义分割算法的简介.使用方法.案例应用之详细攻略 目录 图像分割算法的简介 1.常用的数据集 2.图像分割的评价指标

  3. 【图像分割模型】全景分割是什么?

    这是专栏<图像分割模型>的第12篇文章.在这里,我们将共同探索解决分割问题的主流网络结构和设计思想. 本文是专栏的最后一篇文章,见识过了分割任务中的大量模型,也了解了语义分割与实例分割,这 ...

  4. 【图像分割模型】实例分割模型—DeepMask

    这是专栏<图像分割模型>的第11篇文章.在这里,我们将共同探索解决分割问题的主流网络结构和设计思想. 本文介绍了用于实例分割任务的模型结构--DeepMask. 作者 | 孙叔桥 编辑 | ...

  5. 线性插值改变图像尺寸_【图像分割模型】实例分割模型—DeepMask

    这是专栏<图像分割模型>的第11篇文章.在这里,我们将共同探索解决分割问题的主流网络结构和设计思想. 本文介绍了用于实例分割任务的模型结构--DeepMask. 作者 | 孙叔桥 编辑 | ...

  6. 图像分割之静态背景分割综述

    原文地址:图像分割之静态背景分割综述 作者:pursuiting 静态背景分割方法的比较 摘要: 在静态或运动补偿的照相机中,静态背景分割方法能应用于从背景分割出有意义的前景物体.尽管提出了许多方法, ...

  7. 深度学习,分割后处理之通过连通成分分析去除假阳性区域,提高分割准确度

    用深度学习方法得到的分割结果,会有一些假阳性区域.通过去除这些假阳性区域,可以提高分割结果. 比如说做肾分割,大家都知道,肾只有左右两边有,如果分割结果出现了三个区域,则可以根据常识,去除那个假阳性区 ...

  8. 「图像分割模型」全景分割是什么?

    https://www.toutiao.com/a6717219520286556679/ 这是专栏<图像分割模型>的第12篇文章.在这里,我们将共同探索解决分割问题的主流网络结构和设计思 ...

  9. 图像分割之最大熵阈值分割

    最大熵阈值分割法和OTSU算法类似,假设将图像分为背景和前景两个部分.熵代表信息量,图像信息量越大,熵就越大,最大熵算法就是找出一个最佳阈值使得背景与前景两个部分熵之和最大. 基本原理 频率和概率 直 ...

  10. matlab中图像分割技术之三分水岭分割法

      分水岭算法是一种基于形态学的算法,是对图像的梯度分割.而图像分割的目的是将图像分割成不同的特体,即提取物体的边缘.由于物体边缘的灰度变换比较强烈,而梯度图像正好描述了图像的灰度变换情况.因此,可先 ...

最新文章

  1. 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)...
  2. 使用 AngularJS 和 Electron 构建桌面应用
  3. 在网页中给Flash加上超级链接
  4. ubuntu 手动安装mysql
  5. 关于ugc的一点思考
  6. opencv 重用代码块记录
  7. 给老板汇报技术规划的一些要点(转)
  8. each iteration和 each occurrunce的区别
  9. [改善Java代码]使用静态内部类提高封装性
  10. Java实现猜拳游戏
  11. 从Internet上下载ActiveX(转)
  12. tweenmax笔记
  13. 数码相框_在LCD上显示英文字母、汉字的点阵显示(2)
  14. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
  15. w7系统怎么开启打印机服务器,W7系统如何开启打印机服务
  16. mybatis批量更新数据三种方法效率对比
  17. 树的先序/中序/后序遍历
  18. 太极图php代码,css画太极图(阴阳八卦)
  19. 浅谈设计模式(一)策略模式
  20. 【数据库】数据库管理系统(Database Management Systems)

热门文章

  1. 利用threading多线程爬取王者荣耀的高清壁纸
  2. python对网站DDos攻击
  3. 洛谷P1308 统计单词数
  4. 用大数据把电视观众“挖”出来
  5. 激光跟踪传感器的工作原理
  6. 杂七杂八(4): win10设置启动时创建系统还原点
  7. iBox-面向Flutter的一站式研发工作台
  8. Android图形编程篇--OpenGL实现三角形隧道效果
  9. 基于FPGA的ROM-VGA图像处理(老师好帅系列)
  10. python爬虫实验总结_Python爬虫总结