区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。
区域生长的原理:
区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了。
区域生长实现的步骤如下:
1. 对图像顺序扫描!找到第1个还没有归属的像素, 设该像素为(x0, y0);
2. 以(x0, y0)为中心, 考虑(x0, y0)的4邻域像素(x, y)如果(x0, y0)满足生长准则, 将(x, y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈;
3. 从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2;
4. 当堆栈为空时!返回到步骤1;
5. 重复步骤1 - 4直到图像中的每个点都有归属时。生长结束。
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import numpy as np
import cv2
class Point( object ):
def __init__( self ,x,y):
self .x = x
self .y = y
def getX( self ):
return self .x
def getY( self ):
return self .y
def getGrayDiff(img,currentPoint,tmpPoint):
return abs ( int (img[currentPoint.x,currentPoint.y]) - int (img[tmpPoint.x,tmpPoint.y]))
def selectConnects(p):
if p ! = 0 :
connects = [Point( - 1 , - 1 ), Point( 0 , - 1 ), Point( 1 , - 1 ), Point( 1 , 0 ), Point( 1 , 1 ), \
Point( 0 , 1 ), Point( - 1 , 1 ), Point( - 1 , 0 )]
else :
connects = [ Point( 0 , - 1 ), Point( 1 , 0 ),Point( 0 , 1 ), Point( - 1 , 0 )]
return connects
def regionGrow(img,seeds,thresh,p = 1 ):
height, weight = img.shape
seedMark = np.zeros(img.shape)
seedList = []
for seed in seeds:
seedList.append(seed)
label = 1
connects = selectConnects(p)
while ( len (seedList)> 0 ):
currentPoint = seedList.pop( 0 )
seedMark[currentPoint.x,currentPoint.y] = label
for i in range ( 8 ):
tmpX = currentPoint.x + connects[i].x
tmpY = currentPoint.y + connects[i].y
if tmpX < 0 or tmpY < 0 or tmpX > = height or tmpY > = weight:
continue
grayDiff = getGrayDiff(img,currentPoint,Point(tmpX,tmpY))
if grayDiff < thresh and seedMark[tmpX,tmpY] = = 0 :
seedMark[tmpX,tmpY] = label
seedList.append(Point(tmpX,tmpY))
return seedMark
img = cv2.imread( 'lean.png' , 0 )
seeds = [Point( 10 , 10 ),Point( 82 , 150 ),Point( 20 , 300 )]
binaryImg = regionGrow(img,seeds, 10 )
cv2.imshow( ' ' ,binaryImg)
cv2.waitKey( 0 )
|
以上这篇Python简单实现区域生长方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/bagboy_taobao_com/article/details/5666091