目录
前言:
算法理论:
前言:
今天学习到了一种新的图像分割方法:基于区域生长的分割算法。
正文:
算法理论:
区域生长分割算法广泛应用于图像分割中,二维图像常常采取区域生长分割算法实现图像分割,由于其分割的高效性,现已被应用于3D分割中,PCL中的类PCL :: RegionGrowing用来实现点云的区域生长分割区域生长分割是基于点云法线的分割算法,算法的主要思路如下:
(1)根据点的曲率值对点云进行排序,曲率最小的点叫做初始种子点,区域生长算法从曲率最小的种子点开始生长,初始种子点所在区域为最平滑区域,从初始种子点所在的区域开始生长可减小分割片段的总数,从而提高算法的效率。
(2)设置一空的聚类区域?和空的种子点序列Q,选好初始种子点,将其加入种子点序列,并搜索该种子点的领域点,计算每一个领域点法线与种子点法线之间的夹角,小于设定的平滑阀值时,将领域点加入到?中,同时判断该领域点的曲率值是否小于曲率阀值,将小于曲率阔值的领域点加入种子点序列Q中,在Q中重新选择新的种子点重复上述步骤,直到Q中序列为空,算法结束。
代码如下:
import cv2
import math
import numpy as np
import os
import random
tempLst=[]
size=0
lst=[]
def inLst(i,j):
for temp in lst:
if temp[0]==i and temp[1]==j:
return True
return False
def filltempLst(i,j,rows,cols,image,record):
lst1=[[i,j]]
myRecord=np.zeros(image.shape)
while len(lst1)>0:
temp_len=len(lst1)
temp_i=lst1[temp_len-1][0]
temp_j=lst1[temp_len-1][1]
lst1.pop()
if record[temp_i,temp_j]==1:
tempLst.clear()
return False
tempLst.append([temp_i,temp_j])
myRecord[temp_i,temp_j]=1
get_i=temp_i-1
get_j=temp_j
if get_i>=0 and image[get_i,get_j]>0:
if myRecord[get_i,get_j]==0:
myRecord[get_i,get_j]=1
lst1.append([get_i,get_j])
get_i=temp_i+1
get_j=temp_j
if get_i<rows and image[get_i,get_j]>0:
if myRecord[get_i,get_j]==0:
myRecord[get_i,get_j]=1
lst1.append([get_i,get_j])
get_i=temp_i
get_j=temp_j-1
if get_j>=0 and image[get_i,get_j]>0:
if myRecord[get_i,get_j]==0:
myRecord[get_i,get_j]=1
lst1.append([get_i,get_j])
get_i=temp_i
get_j=temp_j+1
if get_j<cols and image[get_i,get_j]>0:
if myRecord[get_i,get_j]==0:
myRecord[get_i,get_j]=1
lst1.append([get_i,get_j])
for x in tempLst:
record[x[0],x[1]]=1
return True
def getMaxConnect(image,record):
global size
global lst
[rows,cols]=image.shape
for i in range(rows):
for j in range(cols):
if image[i,j]>0:
if filltempLst(i,j,rows,cols,image,record):
if len(tempLst)>size:
size=len(tempLst)
lst=tempLst[:]
tempLst.clear()
if __name__ == "__main__":
path = '8888.png'
print("path:" + path)
img = cv2.imdecode(np.fromfile(path, dtype=np.uint8), -1)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(img, (5, 5), 0)
ret3, th3 = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imwrite("aa.png", th3)
ret3, th3 = cv2.threshold(th3, 0, 255, cv2.THRESH_BINARY_INV)
#img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 17, 6)
sp = img.shape
record = np.zeros(sp)
getMaxConnect(th3, record)
th3= np.zeros(th3.shape)
for x in lst:
th3[x[0],x[1]]=255
cv2.imshow("bb",th3)
cv2.imwrite("bb.png",th3)
cv2.waitKey(0)
#getMaxConnect(arr, record)
参考资料:https://blog.csdn.net/nineship/article/details/86168235
|