写完这篇,图像分割的传统方法就快全了,传统图像分割大体有基于阈值的,这类就没啥算法可以写,所以直接略过了;然后就是K-means这种聚类/分裂的,从几个点开始进行聚类分割,或者一张图不断分裂达到分割目的;

【手撕算法】K-means算法实现主题色提取

再有就是区域生长这类的;

【手撕算法】基于队列实现的区域增长分割算法

以及分水岭算法,分水岭算法代码写好有一段时间了,但实在不知道文章咋写…就再放放吧;最后就是超像素分割了,超像素分割有k-means算法的影子,所以可以先看看k-means算法的代码实现过程。

1,算法原理

  1. 初始化种子点(聚类中心):按照设定的超像素个数,在图像内均匀的分配种子点。假设图片总共有 N 个像素点,预分割为 K 个相同尺寸的超像素,那么每个超像素的大小为N/ K ,则相邻种子点的距离(步长)近似为S=sqrt(N/K)。

  2. 在种子点的n*n邻域内重新选择种子点(一般取n=3)。具体方法为:计算该邻域内所有像素点的梯度值,将种子点移到该邻域内梯度最小的地方。这样做的目的是为了避免种子点落在梯度较大的轮廓边界上,以免影响后续聚类效果。

  3. 在每个种子点周围的邻域内为每个像素点分配类标签(即属于哪个聚类中心)。和标准的k-means在整张图中搜索不同,SLIC的搜索范围限制为2S2S,可以加速算法收敛,如下图。在此注意一点:期望的超像素尺寸为SS,但是搜索的范围是2S*2S。

  4. 距离度量。包括颜色距离和空间距离。对于每个搜索到的像素点,分别计算它和该种子点的距离。距离计算方法如下:

    其中,dc代表颜色距离,ds代表空间距离,Ns是类内最大空间距离,定义为Ns=S=sqrt(N/K),适用于每个聚类。最大的颜色距离Nc既随图片不同而不同,也随聚类不同而不同,所以我们取一个固定常数m(取值范围[1,40],一般取10)代替。最终的距离度量D’如下:

    由于每个像素点都会被多个种子点搜索到,所以每个像素点都会有一个与周围种子点的距离,取最小值对应的种子点作为该像素点的聚类中心。

  5. 迭代优化。理论上上述步骤不断迭代直到误差收敛(可以理解为每个像素点聚类中心不再发生变化为止),实践发现10次迭代对绝大部分图片都可以得到较理想效果,所以一般迭代次数取10。

  6. 增强连通性。经过上述迭代优化可能出现以下瑕疵:出现多连通情况、超像素尺寸过小,单个超像素被切割成多个不连续超像素等,这些情况可以通过增强连通性解决。主要思路是:新建一张标记表,表内元素均为-1,按照“Z”型走向(从左到右,从上到下顺序)将不连续的超像素、尺寸过小超像素重新分配给邻近的超像素,遍历过的像素点分配给相应的标签,直到所有点遍历完毕为止。

2,伪算法描述

3,程序介绍

程序声明了一个SLIC算法类,类的具体程序太长了,就不贴了,大家可以去qq群【222954293】下载程序自己看,都注释好了。

就看一下主程序吧:

int main()
{【1】读取原图并显示Mat image = imread("千矢.png",33);if (image.empty()){printf_s("图片读取失败");return -1;}imshow("原图", image);【2】转换为LAB颜色空间  方便计算距离Mat lab_image = image.clone();cvtColor(image, lab_image, COLOR_BGR2Lab);//定义超像素数以及权重int w = image.cols, h = image.rows;int nr_superpixels = 300;//超像素数int nc = 40;//权重mdouble step = sqrt((w * h) / (double)nr_superpixels);【3】执行SLIC超像素算法SLIC slic;slic.generate_superpixels(&lab_image, step, nc);slic.create_connectivity(&lab_image);【4】显示分割轮廓和分割结果图//该三个函数可以分别注释单独显示查看slic.colour_with_cluster_means(&image);//颜色均值填充slic.display_contours(&image, Scalar(0, 0, 255));//显示轮廓//slic.display_center_grid(&image, Scalar(255, 0, 0));//显示中心点imshow("result", image);waitKey(0);
}

一共是四个步骤。其中步骤【2】中需要自己定义两个变量nr_superpixels和nc。

  • nr_superpixels为超像素个数,你可以根据图像大小自己定义,如果图像x方向10个超像素块,y方向30个超像素块,那就是300。
  • 权重变量nc,即上文【算法原理】第4步中的固定常数m,一般取1-40范围内的整数。

3,效果展示


4,THE END

本文原创内容有限,就是整合了一下自己看的超像素分割的博客,两篇不错的链接放这儿了:

https://blog.csdn.net/zhj_matlab/article/details/52986700
https://blog.csdn.net/qq_26129959/article/details/90760028

代码放qq群【222954293】了,今天就到这里啦。

【手撕算法】C++实现超像素分割算法相关推荐

  1. 超像素分割算法————综述

    参考:超像素-学习笔记 什么是超像素?评价标准?SLIC.SEED.ETPS算法 比较的指标:图像边界的粘附性.算法速度.存储效率.分割性能 超像素算法:将像素组合成感知有意义的原子区域( atomi ...

  2. 超像素分割算法matlab_像素不够,算法来凑。这个图像超分辨率项目帮你「拍」出高清照片...

    ​图像超分辨率是指由一幅低分辨率图像或图像序列恢复出高分辨率图像.图像超分辨率技术分为超分辨率复原和超分辨率重建.一位 Reddit 网友贴出了自己基于 Keras 的图像超分辨率项目,可以让照片放大 ...

  3. SLIC图像超像素分割算法解析

    转载自http://blog.chinaunix.net/uid-29431466-id-4831314.html 1 概述 SLIC 即simple linear iterative cluster ...

  4. 论文解读:《自适应非局部随机游动用于图像超像素分割》

    论文解读:<Adaptive Nonlocal Random Walks for Image Superpixel Segmentation> 1.文章概述 2.背景 2.1 现有的超像素 ...

  5. julia 调用python库_Julia调用Python实现超像素分割SLIC算法

    最近想要在julia中实现 Simple Linear Iterative Clustering (SLIC) 算法对图像进行超像素分割,关于SLIC超像素分割算法,请参考SLIC Superpixe ...

  6. 超像素分割(Slic算法)——个人梳理

    一.使用背景 我在进行乳腺癌图像识别的学校项目中,参考了山东大学的硕士论文,并希望加以简化复现,此论文会在文末附上.项目要求我们需要对乳腺癌图片进行分类(无肿瘤,良性肿瘤,恶性肿瘤),参照论文所说,我 ...

  7. python-opencv实现图像超像素分割(SLIC、SEEDS、LSC)

    转载自:苏格拉- PYTHON - OPENCV实现图像超像素分割(SLIC.SEEDS.LSC) 超像素 超像素是把一张图片中具有相似特征的像素进行聚类,形成一个更具有代表性的大"像素&q ...

  8. 为什么SLIC算法得到的超像素个数和预期的不一致

    为什么SLIC代码得到的超像素个数和预期的不一致 VL_Feat库中的SLIC代码由Andrea Vedaldi给出,Xu于2017年提出的带有部分改进的针对高光谱图像的SLIC算法,将欧氏距离改为S ...

  9. SLIC超像素分割的算法介绍和源码分析

    前述 最近在看显著性检测,发现很多算法的基础是超像素分割,而正在看的Saliency Optimization from Robust Background Detection算法的预处理是SLIC算 ...

  10. 图像分割:Python的SLIC超像素分割

    图像分割:Python的SLIC超像素分割 1. 什么是超像素? 2. 为什么超像素在计算机视觉方面有重要的作用? 3. 简单线性迭代聚类(SLIC) 4. 效果图 5. 源码 参考 1. 什么是超像 ...

最新文章

  1. 百度CTO王海峰博鳌解读AI“融合创新”,算力算法数据发挥综合作用
  2. MySQL innodb_flush_method 【转载】
  3. 中国农业科技领域最大一笔融资来了:极飞科技拿下12亿投资,百度&软银领投...
  4. 【学习笔记】JSON基础概念简介
  5. NFS Volume Provider(Part II) - 每天5分钟玩转 OpenStack(63)
  6. 指针数组的初始化和遍历,并且通过for循环方式、函数传参方式进行指针数组的遍历...
  7. java swing 总结_java实验之swing图形用户界面程序设计及总结
  8. 纯CSS实现的滑动的可折叠菜单
  9. iis6扩展php_教你IIS6的PHP最佳配置方法
  10. 快速突破面试算法之链表篇
  11. Web渗透测试-实战 方法 思路 总结
  12. [机缘参悟-65]:《兵者,诡道也》-7-三十六计解读-败战计
  13. QCC3040---如何设置PIO为中断
  14. python 阮一峰_阮一峰:Fish shell 入门教程
  15. 对话窗口、面板滚动视图、标签切换视图;QDialog、QScroollArea、
  16. 安利一个超好用的录屏工具,收藏必备! - 网课、游戏、录音等免费录制
  17. 2022react面试题整理
  18. zblog php wordpress,zblog和wordpress哪个好
  19. 用python做网站开发的课程_腾讯课堂:Flask Python Web 网站开发
  20. 刀片服务器可以接无线网卡吗,购买一台刀片服务器其硬件成本需不需要关注?...

热门文章

  1. B站批量下载工具——下载姬
  2. python 异步定时任务
  3. 【微信小程序】项目实战—抽签应用
  4. 2021年8月21日 Python图像全景拼接
  5. windows freeSSHd搭建SFtp服务器
  6. 第十四届恩智浦智能车竞赛小白四轮硬件总结
  7. (附源码)springboot自律健身房会员管理系统 毕业设计456466
  8. lammps后处理:ovito快速提取单条位错线的伯氏矢量
  9. reactos操作系统实现(108)
  10. 单片机STM8S测量电压电路_50个单片机晶振问题及解决方法小结