前提・実現したいこと
ここに質問の内容を詳しく書いてください。
pythonを学び始めて3ヶ月ほどのものです。
ライブラリを使用せずに動的輪郭法(snakes)のプログラムを実装しているのですがネットでコードを公開している方のものを拝見させていただいたのですが所々わからないのでよろしければご教授いただきたいです。
実際このプログラムがどこで点を移動させているのかがいまいちわからないです。
発生している問題・エラーメッセージ
自分の認識では頂点が2000個の四角形を初期輪郭点として定義し、その点の8近傍を探してエネルギー値が最小になる点に移動させているというプログラムなのですがどこの部分でその点を最小値として認識し、移動させているのかがわからないです。
該当のソースコード
import numpy as np
import cv2
import math
import copy
test = cv2.imread("./Img/input.jpg", cv2.IMREAD_COLOR)#BGRなので気をつける
gray_test = cv2.imread("./Img/input.jpg",cv2.IMREAD_GRAYSCALE)
height = test.shape[0]
width = test.shape[1]
cv2.imwrite('./Img/test.jpg', test)
cv2.imwrite('./Img/gray_test.jpg',gray_test)
N = 2000
v = np.zeros((N,2))
start_v = np.zeros((N,2))
vec_g = np.zeros(2)
for i in range(0,N):
if(i<N/4):
v[i] = [height/(N/4)i,0]
elif(i<2N/4):
v[i] = [height-1,width/(N/4)(i-N/4)]
elif(i<3N/4):
v[i] = [height-1-height/(N/4)(i-2N/4),width-1]
else:
v[i] = [0,width-1 - width/(N/4)(i-3N/4)]
start_v = copy.deepcopy(v)
display = copy.deepcopy(test)
alpha =1
beta = 1
gamma = 10
kappa =1
def EpsIn(vec0,vec1,vec2):
value = 0
value += alphanp.linalg.norm(vec1-vec0)**2+betanp.linalg.norm(vec2-2*vec1+vec0)**2
value /= 2
return value
def EpsEx(vec0,pix):#gray
value = 0
x = int(vec0[0])
y = int(vec0[1])
if(x+1 >= height or y+1 >= width): return float('inf') else: I = [abs(int(pix[x+1,y]) - int(pix[x,y])) ,abs(int(pix[x,y+1])-int(pix[x,y]))] value = -gamma*np.linalg.norm(I)**2 print("Ex:"+str(value)) return value
def EpsCon(vec0,vec_g):#test
value = 0
value += kappa*np.linalg.norm((vec0[0] - vec_g[0],vec0[1]-vec_g[1]))**2
print("Con:"+str(value))
return value
def Energy(vec0,vec1,vec2,vec_g,pix):
value = 0
value = EpsIn(vec0,vec1,vec2)+EpsEx(vec0,pix)+EpsCon(vec0,vec_g)
print("Result:"+str(value))
return value
n = 500
dx = [-1, -1, -1, 0, 0, 0, 1, 1, 1]
dy = [1, 0, -1, 1, 0, -1, 1, 0, -1]
flag = 4
for loop in range(0,n):
for i in range(0,N):
flag = 4
eps_min = float('inf')
vec_g = [0,0]
for j in range(0,9):
move = [v[i,0]+dx[j], v[i,1]+dy[j]]
if(move[0] < 0 or move[1] < 0 or move[0] >= height or move[1] >= width):
continue #はみ出し処理
vec_g = [int(height/2),int(width/2)]
energy = Energy(move,v[(i+1)%N],v[(i+2)%N],vec_g,gray_test) if(eps_min>energy): eps_min = energy flag = j v[i] += [dx[flag],dy[flag]]
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー