位置: IT常识 - 正文

超像素(superpixel)——SLIC和深度学习法(超像素和markpage的区别)

编辑:rootadmin
超像素(superpixel)——SLIC和深度学习法 定义

推荐整理分享超像素(superpixel)——SLIC和深度学习法(超像素和markpage的区别),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:超像素只有一层图层吗,超像素生存破解版,超像素生存破解版,超像素只有一层图层吗,超像素生存破解版,超像素分割,超像素分割,超像素算法,内容如对您有帮助,希望把文章链接给更多的朋友!

可以理解成在图像上做的聚类问题。超像素的做法是将感知上相似的像素组在一起,称为一个超像素,以此来提供图像数据的紧凑表示。然后在后续的处理,处理单位就变成了超像素,而不是我们常用的像素。

一般超像素的结果可以为下游任务提供帮助,比如说语义分割、对象检测等。

SLIC

Simple Linear Iterative Clustering,简单的线性迭代聚类

论文:2011-PAMI-SLIC Superpixels Compared to State-of-the-art Superpixel Methods

前提:这个算法实在CIELAB这个颜色空间上做的,即每个pixel的值用来表示,其中表示亮度(取值范围0-100,数值越大越亮);表示红色到绿色之间的色域(负值表示绿色,正值表示红色);表示黄色和蓝色之间的色域(负值表示蓝色,正值表示黄色)。

符号表示:

假设一张图片有N个像素,需要我们人为去设定的超参数有且仅有一个,就是超像素的个数k。

那么,每个超像素的平均面积是,每个超像素中心的平均间隔是

算法实现:

关于初始化:

初始化各个超像素中心的位置。比如一张图片的大小为,将其均分成个grid,然后设置每个grid的中心为一个超像素的中心。微调这些超像素的中心,在以它们为中心的邻域里进行计算,将超像素中心更换成其中梯度值最小的。这样做的目的是为了防止超像素中心落在边缘/噪点上。标签表示像素i属于哪一个superpixel,距离表示像素i与其所属的superpixel的中心的距离。初始化每一个像素i的,

进行下面迭代直到收敛,收敛的前提是误差满足一定要求:

对于每个聚类中心:

        对于以其为中心的邻域内的每个像素i: 

                计算与i之间的距离D

                如果,那么更新,。

超像素(superpixel)——SLIC和深度学习法(超像素和markpage的区别)

                [这表明将i分到以为中心的超像素中]

重新计算聚类中心

关于点与点之间距离D的定义:

由两个距离加权而得,分别是颜色域之间的距离和空间域之间的距离。

颜色域距离: 

空间域距离:

距离D的计算:

,其中指的是maximum spatial distance,超像素中包含的平均像素个数,即为S;指的是maximum color distance,在实际应用中通常用一个人为设定的常数m来表示即可。

那么,上式可以被重写成

我们实际生活中用的距离公式与上式等价

m越大,距离D受空间域距离影响越大,产生的超像素将更紧凑;m越小,距离D受颜色域影响越大,产生的超像素将更加紧密地附着在图像边界(edge)上。

 代码实现

源码地址:GitHub - aleenaniklaus/SLIC_superpixels: SLIC Superpixels* implementation was my final computer vision project. Superpixels are instrumental in segmentation. This implementation is a proof of concept as taken from SLICsuperpixels paper mentioned in README.SLIC Superpixels* implementation was my final computer vision project. Superpixels are instrumental in segmentation. This implementation is a proof of concept as taken from SLICsuperpixels paper mentioned in README. - GitHub - aleenaniklaus/SLIC_superpixels: SLIC Superpixels* implementation was my final computer vision project. Superpixels are instrumental in segmentation. This implementation is a proof of concept as taken from SLICsuperpixels paper mentioned in README.https://github.com/aleenaniklaus/SLIC_superpixels

稍微修改了一下代码细节,让大家能更加直观地看到超像素分割和原图信息的对应关系。另外,我们还能从超像素图导出一张超像素掩码(superpixel mask),也就是将超像素的边缘设置成0,超像素内部设置为1的mask。这个掩码能在一定程度上反映图片的结构信息。

import numpyimport cv2import tqdmimport argparse# 将原作者的sys转换成paramsparser = argparse.ArgumentParser(description='SLIC-python')parser.add_argument('--img_path', default='lena.png', type=str, help="单张图片的路径")parser.add_argument('--k', default=500, type=int, help="超像素个数")parser.add_argument('--SLIC_ITERATIONS', default=4, type=int, help="SLIC计算过程中的迭代次数")parser.add_argument('--m', default=40, type=int, help="权衡颜色和位置对距离影响的权重参数")args = parser.parse_args()def generate_pixels(): indnp = numpy.mgrid[0:SLIC_height, 0:SLIC_width].swapaxes(0, 2).swapaxes(0, 1) # 迭代SLIC_ITERATIONS次 for i in tqdm.tqdm(range(SLIC_ITERATIONS)): SLIC_distances = 1 * numpy.ones(img.shape[:2]) # 按次序取出聚类中心SLIC_centers[j] for j in range(SLIC_centers.shape[0]): # 框出该聚类中心的搜索范围 x_low, x_high = int(SLIC_centers[j][3] - step), int(SLIC_centers[j][3] + step) y_low, y_high = int(SLIC_centers[j][4] - step), int(SLIC_centers[j][4] + step) # 防止搜索范围超出图像边界[保证搜索范围有效性] if x_low <= 0: x_low = 0 if x_high > SLIC_width: x_high = SLIC_width if y_low <= 0: y_low = 0 if y_high > SLIC_height: y_high = SLIC_height # cropimg是该聚类中心对应的2S\times2S内的有效邻域 cropimg = SLIC_labimg[y_low: y_high, x_low: x_high] # 挨个像素算出颜色差 color_diff = cropimg - SLIC_labimg[int(SLIC_centers[j][4]), int(SLIC_centers[j][3])] # 算出颜色距离 color_distance = numpy.sqrt(numpy.sum(numpy.square(color_diff), axis=2)) yy, xx = numpy.ogrid[y_low: y_high, x_low: x_high] # 算出空间距离 pixdist = ((yy - SLIC_centers[j][4]) ** 2 + (xx - SLIC_centers[j][3]) ** 2) ** 0.5 # 运用论文中的(2)式计算邻域内pixel与该邻域中心的聚类中心的距离(加权求和) # SLIC_m is "m" in the paper, (m/S)*dxy dist = ((color_distance / SLIC_m) ** 2 + (pixdist / step) ** 2) ** 0.5 # 更新距离,更新了距离的pixel也更新聚类中心为SLIC_centers[j] distance_crop = SLIC_distances[y_low: y_high, x_low: x_high] idx = dist < distance_crop distance_crop[idx] = dist[idx] SLIC_distances[y_low: y_high, x_low: x_high] = distance_crop SLIC_clusters[y_low: y_high, x_low: x_high][idx] = j for k in range(len(SLIC_centers)): # 对于第k个聚类,找到聚类中心为SLIC_centers[k]的pixel idx = (SLIC_clusters == k) # 分别取出他们的颜色和位置索引 colornp = SLIC_labimg[idx] distnp = indnp[idx] # 重新计算聚类中心的颜色和位置坐标(这个聚类中心和k-means中的一样,不一定是已有的点) SLIC_centers[k][0:3] = numpy.sum(colornp, axis=0) sumy, sumx = numpy.sum(distnp, axis=0) SLIC_centers[k][3:] = sumx, sumy ### 注:numpy.sum(idx)是该聚类pixel数目 SLIC_centers[k] /= numpy.sum(idx)# At the end of the process, some stray labels may remain meaning some pixels# may end up having the same label as a larger pixel but not be connected to it# In the SLIC paper, it notes that these cases are rare, however this# implementation seems to have a lot of strays depending on the inputs givendef create_connectivity(): """ 按照论文的说法,总有那么些点和它对应的超像素是分离的(比较零散的碎点) 运用connected components algorithm来将这些零散的点分配给最近的聚类中心 """ label = 0 adj_label = 0 lims = int(SLIC_width * SLIC_height / SLIC_centers.shape[0]) new_clusters = -1 * numpy.ones(img.shape[:2]).astype(numpy.int64) elements = [] for i in range(SLIC_width): for j in range(SLIC_height): if new_clusters[j, i] == -1: elements = [] elements.append((j, i)) for dx, dy in [(-1, 0), (0, -1), (1, 0), (0, 1)]: x = elements[0][1] + dx y = elements[0][0] + dy if (x >= 0 and x < SLIC_width and y >= 0 and y < SLIC_height and new_clusters[y, x] >= 0): adj_label = new_clusters[y, x] # end # end # end count = 1 counter = 0 while counter < count: for dx, dy in [(-1, 0), (0, -1), (1, 0), (0, 1)]: x = elements[counter][1] + dx y = elements[counter][0] + dy if (x >= 0 and x < SLIC_width and y >= 0 and y < SLIC_height): if new_clusters[y, x] == -1 and SLIC_clusters[j, i] == SLIC_clusters[y, x]: elements.append((y, x)) new_clusters[y, x] = label count += 1 # end # end # end counter += 1 # end if (count <= lims >> 2): for counter in range(count): new_clusters[elements[counter]] = adj_label # end label -= 1 # end label += 1 # end # end SLIC_new_clusters = new_clusters# enddef display_contours(color): is_taken = numpy.zeros(img.shape[:2], numpy.bool) # 标志哪些点是聚类与聚类之间的edge contours = [] for i in range(SLIC_width): for j in range(SLIC_height): nr_p = 0 for dx, dy in [(-1, 0), (-1, -1), (0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1)]: x = i + dx y = j + dy if x >= 0 and x < SLIC_width and y >= 0 and y < SLIC_height: if is_taken[y, x] == False and SLIC_clusters[j, i] != SLIC_clusters[y, x]: nr_p += 1 # end # end # end if nr_p >= 2: is_taken[j, i] = True contours.append([j, i]) # 将这些edge-pixel全用黑色来表示 for i in range(len(contours)): img[contours[i][0], contours[i][1]] = color mask[contours[i][0], contours[i][1]] = color # end# enddef find_local_minimum(center): """ 微调 在3\times3领域内找梯度最小的点作为初始聚类中心 """ min_grad = 1 loc_min = center for i in range(center[0] - 1, center[0] + 2): for j in range(center[1] - 1, center[1] + 2): c1 = SLIC_labimg[j + 1, i] c2 = SLIC_labimg[j, i + 1] c3 = SLIC_labimg[j, i] if ((c1[0] - c3[0]) ** 2) ** 0.5 + ((c2[0] - c3[0]) ** 2) ** 0.5 < min_grad: min_grad = abs(c1[0] - c3[0]) + abs(c2[0] - c3[0]) loc_min = [i, j] return loc_mindef calculate_centers(): """ 按照grid_cell初始化聚类中心 """ centers = [] for i in range(step, SLIC_width - int(step / 2), step): for j in range(step, SLIC_height - int(step / 2), step): nc = find_local_minimum(center=(i, j)) # 微调 color = SLIC_labimg[nc[1], nc[0]] center = [color[0], color[1], color[2], nc[0], nc[1]] # LAB+XY centers.append(center) return centers # 储存聚类中心的信息# 样例命令是slic.py Lenna.png 1000 40# sys.argv[1]是放图片路径# sys.argv[2]这个参数指示划分的superpixel的个数# sys.argv[3]这个参数是论文中的m与论文中的m对应,是计算点与点间的距离时用于衡量颜色距离和空间距离所占权重的重要参数# global variablesimg = cv2.imread(args.img_path)mask = 255 * numpy.ones(img.shape).astype('uint8')step = int((img.shape[0] * img.shape[1] / args.k) ** 0.5) # 每个superpixel中心之间的平均距离SLIC_m = args.mSLIC_ITERATIONS = args.SLIC_ITERATIONS # 迭代次数SLIC_height, SLIC_width = img.shape[:2]SLIC_labimg = cv2.cvtColor(img, cv2.COLOR_BGR2LAB).astype(numpy.float64) # BGR转LAB# 初始化距离和每个点所属聚类中心SLIC_distances = 1 * numpy.ones(img.shape[:2])SLIC_clusters = -1 * SLIC_distances ### 我们应该是依靠这个搞出mask #### 聚类中心初始化SLIC_center_counts = numpy.zeros(len(calculate_centers()))SLIC_centers = numpy.array(calculate_centers())# maingenerate_pixels() # 迭代SLIC_ITERATIONS次,聚好各组点,算出他们的聚类中心位置和类颜色create_connectivity() # 后处理,对一些比较零散的点重新分配给邻近的聚类calculate_centers()display_contours([0.0, 0.0, 0.0])img2 = numpy.hstack((img, mask))cv2.imwrite(args.img_path.replace(".png","_{}_SLIC.png".format(args.k)), img2)结果展示

我们用非常经典的lena图片来做展示:

设置超像素为500:

 

 设置超像素为100:

深度学习学超像素的方法我后续再补充上来

本文链接地址:https://www.jiuchutong.com/zhishi/297789.html 转载请保留说明!

上一篇:幂等性是什么?(java幂等性是什么)

下一篇:Spring Boot 3.0系列【19】核心特性篇之自定义Starter启动器(spring boot 2.3.0)

  • sony蓝牙耳机怎么重新配对新手机(sony蓝牙耳机怎么样)

    sony蓝牙耳机怎么重新配对新手机(sony蓝牙耳机怎么样)

  • oppo有实况模式吗(oppo有没有实况)

    oppo有实况模式吗(oppo有没有实况)

  • 我的airpods怎么改不了名字(我的airpods怎么改不了名字会不会是版本太低的原因)

    我的airpods怎么改不了名字(我的airpods怎么改不了名字会不会是版本太低的原因)

  • 抖音极速版和抖音火山版的区别在哪里(抖音极速版和抖音账号互通吗)

    抖音极速版和抖音火山版的区别在哪里(抖音极速版和抖音账号互通吗)

  • 声卡的主要功能是支持(声卡的主要功能包括哪些)

    声卡的主要功能是支持(声卡的主要功能包括哪些)

  • 写论文用wps还是word(写论文用wps还是ms)

    写论文用wps还是word(写论文用wps还是ms)

  • 删除用户的命令是什么(linux系统中可用于删除用户的命令)

    删除用户的命令是什么(linux系统中可用于删除用户的命令)

  • 淘宝账号被永封,支付宝怎么办(淘宝账号被永封可以注销吗)

    淘宝账号被永封,支付宝怎么办(淘宝账号被永封可以注销吗)

  • 苹果手机摄像头下面发热是怎么回事(苹果手机摄像头一直抖动是什么原因)

    苹果手机摄像头下面发热是怎么回事(苹果手机摄像头一直抖动是什么原因)

  • 新手机如何登录原手机的账户(新手机如何登录原来的钉钉)

    新手机如何登录原手机的账户(新手机如何登录原来的钉钉)

  • 手机什么软件可以拼视频(手机什么软件可以赚钱真实可靠)

    手机什么软件可以拼视频(手机什么软件可以赚钱真实可靠)

  • 抖音实名认证直播必须是同一人吗(抖音实名认证直播有风险吗)

    抖音实名认证直播必须是同一人吗(抖音实名认证直播有风险吗)

  • 苹果相机兼容性和高效区别(苹果相机兼容性和高效)

    苹果相机兼容性和高效区别(苹果相机兼容性和高效)

  • 微信运动看不见好友步数怎么回事(微信运动看不见好友)

    微信运动看不见好友步数怎么回事(微信运动看不见好友)

  • oppo手机没有超级截屏吗(oppo手机没有超级截屏吗怎么弄)

    oppo手机没有超级截屏吗(oppo手机没有超级截屏吗怎么弄)

  • 钉钉视频能美颜吗(钉钉视频美颜如何开启)

    钉钉视频能美颜吗(钉钉视频美颜如何开启)

  • ipada1538是什么版本(ipada1538多少钱)

    ipada1538是什么版本(ipada1538多少钱)

  • 电脑强制关机按什么键(电脑强制关机按哪个键子)

    电脑强制关机按什么键(电脑强制关机按哪个键子)

  • 爱奇艺视频怎么下载到本地(爱奇艺视频怎么提取出来)

    爱奇艺视频怎么下载到本地(爱奇艺视频怎么提取出来)

  • 如何设置等长下划线(设置为等宽的两栏怎么设置)

    如何设置等长下划线(设置为等宽的两栏怎么设置)

  • 手机有广告怎么去掉呢(手机有广告怎么关闭)

    手机有广告怎么去掉呢(手机有广告怎么关闭)

  • 苹果8夜拍功能在哪里(iphone8夜拍)

    苹果8夜拍功能在哪里(iphone8夜拍)

  • x27有没有人脸识别(x27手机有人脸识别吗)

    x27有没有人脸识别(x27手机有人脸识别吗)

  • 软件危机的定义及表现(软件危机的定义和原因)

    软件危机的定义及表现(软件危机的定义和原因)

  • 快手同乡服务怎么显示(快手同乡服务怎么取消)

    快手同乡服务怎么显示(快手同乡服务怎么取消)

  • 微信下一行如何操作(微信下一行如何切换)

    微信下一行如何操作(微信下一行如何切换)

  • 一加6多少w快充(一加六多少w快充)

    一加6多少w快充(一加六多少w快充)

  • Win10更新错误0x80244007怎么办?0x80244007更新错误修复方法(win10更新错误0x8000402)

    Win10更新错误0x80244007怎么办?0x80244007更新错误修复方法(win10更新错误0x8000402)

  • Windows7旗舰版系统极品飞车17已停止工作的解决方(win7旗舰系统)

    Windows7旗舰版系统极品飞车17已停止工作的解决方(win7旗舰系统)

  • 如何用post的方式进行eventSource请求(post请求怎么用)

    如何用post的方式进行eventSource请求(post请求怎么用)

  • 远期交易怎么结算
  • 进账多于销项怎样报税
  • 畜牧生物工程有限公司
  • 企业所得税分公司先报还是总部先报
  • 存货的加工成本指的是加工过程中发生的追加费用
  • 购入材料用于非增值税纳税项目
  • 800多项进口关税减免
  • 被强制执行的款怎么记账
  • 免税的农业企业可以抵扣专票吗
  • 营改增后填用作废的发票可以用来报销吗?
  • 货物抵扣如何入账
  • 土地增值税缴纳标准
  • 材料报废的会计处理(一般纳税人)
  • 连年亏损的企业因为具有递延税金的优势
  • 劳务费按次500元
  • 如何检验发票真伪
  • 制造企业材料返回流程图
  • 钢管租赁营业执照范围
  • 滴滴出行电子发票备注怎么写
  • 虚开普票是不是很普遍
  • 暂估成本跨年怎么算
  • 减免的城建税如何申报
  • 存出投资款是什么凭证
  • 苹果手机屏幕旋转怎么设置关闭
  • 资产与负债的计税基础
  • 工厂土地被抵押厂房怎么办
  • annaconda安装opencv
  • css如何实现文字环绕
  • 前端基础知识总结
  • 程序人是什么意思
  • 残疾人就业保障金怎么申报
  • 织梦怎么样
  • 用简易计税办法开发票
  • 其他发票包括哪些
  • 参展费可以抵扣吗
  • 打印的机票行程怎么查
  • python elasticsearch timeout
  • mysql 触发器
  • mysql日期和时间类型
  • mongodb管道操作符
  • 在建工程转入固定资产怎么做
  • mysql触发器菜鸟教程
  • 厂房房租发票
  • 国有资产无偿划转需要缴税吗
  • 公司为职工提供免费午餐需要交纳个人所得税吗?
  • 存货报废进项税转出分录
  • 暂估价和实际价格不一致的处理方式
  • 外贸常用的付款方式有哪些
  • 进出口货物报关单填制规范
  • 营业外支出属于费用类科目吗
  • 汇算清缴前跨年调账怎么调
  • 事业单位会计的特点
  • 应收账款的客户如何分析
  • 经费开支要求
  • 投标保证金会计科目
  • 票据行为的构成要件
  • 认购股份的形式主要有
  • 小微企业免税的标准
  • 购买维修费怎么做分录
  • 企业所得税里的利润总额按什么填写
  • 建账的基本原则包括
  • 企业货币资金主要包括哪些
  • 阿里云centos7安装图形界面
  • sql效率调优
  • mac系统怎么打开任务管理器
  • 怎么进入win7系统
  • iphone制造成本
  • windows越狱软件
  • windows7包含6个版本其中什么最强大支持的功能最多
  • win10无法回退到以前的版本怎么办
  • win7桌面右键菜单多余选项删除
  • 新装win8系统卡顿严重,虚拟内存为0
  • python accdb
  • vue如何进行组件化开发
  • shell 循环 for
  • js模拟touch
  • python从入门到精通第三版pdf下载
  • unity5权威讲解
  • android 自定义dialog
  • 建筑工程资质挂靠合同
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设