Python簡單實現區域生長方式
阿新 • • 發佈:2020-01-17
區域生長是一種序列區域分割的影象分割方法。區域生長是指從某個畫素出發,按照一定的準則,逐步加入鄰近畫素,當滿足一定的條件時,區域生長終止。區域生長的好壞決定於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實現
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,Point(1,0),1),\ Point(0,Point(-1,0)] else: connects = [ Point(0,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,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,10) cv2.imshow(' ',binaryImg) cv2.waitKey(0)
以上這篇Python簡單實現區域生長方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。