全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
878 0
2020-12-03
Python中基于图的图像分割
问题定义和基本思想(摘自本文)
令G =(V,E)是一个无向图,其中顶点vi∈V,待分割的元素集,并且边缘(vi,vj)∈E对应于成对的相邻顶点。每个边缘(vi,vj)∈E具有对应的权重w((vi,vj)),这是相邻元素vi和vj之间相异性的非负度量。      
在图像分割的情况下,V中的元素是像素,边缘的权重是对该边缘连接的两个像素之间相异程度的某种度量(例如,强度,颜色,运动,位置或其他局部属性)。
特别是对于实施这里所描述的,边缘权重函数基于所述绝对强度差(在YIQ由边缘连接的像素之间的空间),  W((六,VJ))= | I(PI) - I(PJ) | 。     
在基于图的方法中,分段S是将V划分为多个分量的过程
,以使每个分量(或区域)C∈S对应
于图中G0 =(V,E0)的连接分量,其中E0?E。
换句话说,任何分割都是由E中边缘的子集引起的。测量分割质量的方法有很多,但总的来说,我们希望组件中的元素相似,而不同组件中的元素不相似。
这意味着同一组件中两个顶点之间的边缘应具有较低的权重,而不同组件中两个顶点之间的边缘应具有较高的权重。
下图显示了算法中的步骤。该算法与用于计算无向图的MST的Kruskal算法非常相似。   
f17.png
阈值函数τ控制两个组件之间的差异必须大于其内部差异的程度,以便在它们之间有边界的证据。  
对于小组件,Int(C)不能很好地估计数据的局部特征。在极端情况下,当| C | = 1,Int(C)=0。因此,基于组件大小的阈值函数 τ(C)= k / | C |。需要使用, 其中| C | 表示C的大小,k是一些常数。   
也就是说,对于小零件,我们需要更强有力的边界证据。实际上,k设置观察范围,因为较大的k会导致对较大分量的偏好。
通常, 为了补偿数字化伪像,在计算边缘权重之前,先使用高斯滤波器稍微平滑图像。我们始终使用σ= 0.8的高斯,它不会对图像产生任何可见变化,但有助于消除伪影。  
以下python代码显示了如何创建图形。
1个
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18岁
19
20
21
22
23
24
25
26
27
28
29
30
import numpy as np
from scipy import signal
import matplotlib.image as mpimg
def gaussian_kernel(k
    # generate a (2k+1)x(2k+1) gaussian kernel with mean=0 and sigma = s
    probs = [exp(-z*z/(2*s*s))/sqrt(2*pi*s*s) for z in range(-k
return np.outer(probs
def create_graph(imfile
    # create the pixel graph with edge weights as dissimilarities
     rgb = mpimg.imread(imfile)[:
     gauss_kernel = gaussian_kernel(sz
     for i in range(3):
         rgb[:
     yuv = rgb2yiq(rgb)
     (w
     edges = {}
     for i in range(yuv.shape[0]):
         for j in range(yuv.shape[1]):
             #compute edge weight for nbd pixel nodes for the node i
             for i1 in range(i-1
                 for j1 in range(j-1
                     if i1 == i and j1 == j: continue
                     if i1 >= 0 and i1 = 0 and j1 < h:
                        wt = np.abs(yuv[i
                        n1
                        edges[n1
     return edges
一些结果
图像取自纸张本身或互联网。下图和动画显示了根据组件内部差异,通过迭代合并组件(通过选择最小权重边缘)进行分割的结果。
尽管作者在论文中将参数k的最佳值描述为300左右,但是由于在此实现中,像素RGB值被规范化(值在0 – 1之间),然后转换为YIQ值和YIQ强度用于计算权重(通常很小),在这种情况下效果最好的k值为0.001-0.01。
从下面的结果可以看出,参数k的值越高,最终分量的大小越大,结果中的分量数越少。
还显示了最小生成树的创建,图中显示的红色边缘 是算法选择的用于合并组件的边缘。
输入图像
            player.png
参数k的两个不同值的输出图像
player_k_0.001.gif
player_k_0.01.gif
out_ 0.001player.png
out_ 0.010player.png
经过几次迭代后创建的森林
mst1
输入图像
爬坡道
参数k的两个不同值的输出图像
hill_k_0.01
out_ 0.010hill.png
hill_k_0.001
out_ 0.001hill.png
经过几次迭代后创建的森林
mst3.png
输入图像
鹦鹉
输出分割图像
鹦鹉_k_0.001out_ 0.001parrot_Dark2.pngout_ 0.001parrot_hot.png
输入图像
道路2
分段输出图像
road2_k_0.01
out_ 0.001road2_Set1.png
输入图像

参数k的两个不同值的输出图像
road_k_0.001
out_ 0.001road.png
road_k_0.01out_ 0.010road.png
经过几次迭代后创建的森林
mst2.png
  输入图像(UMBC)
             umbc.png
分段输出图像
umbc_k_0.001out_ 0.001umbc.png
    我NPUT图片
nj.png
k = 0.001的分段输出图像
out_ 0.001nj.png
    我NPUT图片

k = 0.001的分段输出图像
ring_k_0.001
    我NPUT图片
鲜花2
k = 0.001的分段输出图像
out_ 0.001flowers2.png
    我NPUT图片(肝)

分段输出图像
out_ 0.001liver.pngout_ 0.010liver.png
    我NPUT图片
建造
具有不同k值的分段输出图像
building_k_0.01
out_ 0.001building.png out_ 0.010building.png
    我NPUT图片
框号056
分割输出图像
out_ 0.001frame056.png
    我NPUT图片
维克
不同k的分段输出图像
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群