Pythonは簡単に地域の成長方式を実現します。


領域成長はシリアル領域分割の画像分割法である。領域成長とは、ある画素から出発して、一定の基準に従って、隣接画素を段階的に加え、一定の条件を満たすと、領域成長が終了することをいう。ゾーン成長の良し悪しは1.初期点(シード点)の選択に決定される。2.成長基準。3.終了条件。領域成長は、ある画素またはある画素点から出発して、最後に全体の領域を得て、目標の抽出を実現する。
地域成長の原理:   
領域成長の基本的な考えは似た性質を持つ画素を集合させて領域を構成することである。具体的には、各分割が必要な領域について、1つのシード画素を成長の起点として探し、シード画素と周辺の近傍領域においてシード画素と同じまたは類似した性質を持つ画素(ある事前に決定された成長または類似の基準に基づいて判定される)をシード画素が存在する領域に統合する。これらの新しいピクセルは、条件を満たしていないピクセルが含まれるまで、新しいシードとして上記のプロセスを続ける。このように一つの地域が成長してできました。
地域成長の実現のステップは以下の通りである。
1. 画像の順番をスキャンします。第1の未帰属画素が見つかり、 このピクセルを(x 0,y 0);
2. (x 0,y 0)を中心に、 (x 0,y 0)の4近傍の画素(x,y)を考慮した場合(x 0,y 0)は成長基準を満たしており、 (x,y)と(x 0,y 0)を統合(同一領域内)し、 同時に(x,y)をスタックに押し込む。
3. スタックからピクセルを取り出して、 それを(x 0,y 0)としてステップ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, -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は簡単に地域の成長方式を実現しました。つまり、小編集は皆さんに全部の内容を共有しました。参考にしてもらいたいです。どうぞよろしくお願いします。