質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1308閲覧

画像処理の出力に関する質問

bump_fuuu

総合スコア18

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/31 06:13

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
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<2
N/4):
v[i] = [height-1,width/(N/4)(i-N/4)]
elif(i<3
N/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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

最小値の認識

python

1if(eps_min>energy): 2 eps_min = energy 3 flag = j

移動

python

1v[i] += [dx[flag],dy[flag]]

補足

このプログラムの最重要部分は

alpha =1 beta = 1 gamma = 10 kappa =1 def EpsIn(vec0,vec1,vec2):#test value = 0 value += alpha*np.linalg.norm(vec1-vec0)**2+beta*np.linalg.norm(vec2-2*vec1+vec0)**2 value /= 2 # print("In:"+str(value)) 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 energy = Energy(move,v[(i+1)%N],v[(i+2)%N],vec_g,gray_test)

参考になさったページを記述していただけると"大変"助かります。
ソースコードはこちらですね?

投稿2019/01/31 07:06

TodaNext

総合スコア24

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bump_fuuu

2019/01/31 07:22

はい、ソースコードはそのサイトです
bump_fuuu

2019/01/31 07:23

ご回答ありがとうございます!やはりそこなんですね
TodaNext

2019/01/31 07:27

お役に立てたなら幸いです。 ちなみに質問する際のコードはバッククォートで囲むと見やすいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問