1. 程式人生 > 程式設計 >Python簡單實現區域生長方式

Python簡單實現區域生長方式

區域生長是一種序列區域分割的影象分割方法。區域生長是指從某個畫素出發,按照一定的準則,逐步加入鄰近畫素,當滿足一定的條件時,區域生長終止。區域生長的好壞決定於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簡單實現區域生長方式就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。