前提・実現したいこと
画像の輪郭線をたどり、輪郭を色を付け、pngファイルで保存したい。
発生している問題・エラーメッセージ
無限ループが発生しており、終了しない。
該当のソースコード
Python
1import numpy as np 2import cv2 3 4a=np.load('0239_a-1_02_DCIS-LP_7.npy') 5#print(a) # 6 7s1_list = [0] #1,2を記憶するための空リストの作成 8row = a.shape[0] #行 9col = a.shape[1] #列 10num_list = [] #1,2の先頭リスト 11zahyo_list = [] #1,2の先頭座標[j,i]を格納するためのリスト 12newzahyo = [0,0] 13arr_zahyo = [] 14c_numnext = [] 15#p_now = [] 16#p_old = [] 17#3 2 1 18#4 O 0 19#5 6 7 20#という風にOに何を足せば番号の所に行くかを探すコード 21c = np.array([[0,1],#0 22 [-1,1],#1 23 [-1,0],#2 24 [-1,-1],#3 25 [0,-1],#4 26 [1,-1],#5 27 [1,0],#6 28 [1,1]])#7 29 30for j in range(row): #行の要素 31 for i in range(col):#列の要素 32 num = a[j,i] #リストの番号がi,jの時に0,1,2のどれかを格納する 33 if num not in s1_list: 34 num_list.append(num) #numリストにnumを追加する 35 zahyo_list.append([j,i]) #zahyoリストにnumがどこの座標にあったかを追加する 36 s1_list.append(num) # s1_listをnumにする 37 #zahyo2_list.append([j+1,i-1])#2番目のnumが座標のどこにあったかを考える 38 39#print(num_list) 40#print(zahyo_list) 41#print(zahyo2_list) 42#arr_zahyo = np.array(zahyo_list) 43#print(arr_zahyo) 44img = cv2.imread('0239_a-1_02_DCIS-LP_7.png',cv2.IMREAD_COLOR) 45#1つ目の座標 46for k in range(len(num_list)): #numリストの要素k 47 #print(zahyo_list[k][0]) 48 y = zahyo_list[k][0] #numリスト0の要素の要素 49 x = zahyo_list[k][1] #numリスト1の要素の要素 50 img[y,x,:] = [0,0,255] #先頭リストを赤く染める 51 #print(len(num_list)) 52 #print(y) 53 #print(x) 54#2つ目の座標 55for m in range(len(zahyo_list)):#zahyo_lsit分だけmを回す 56 sagasihajime = 3 #探し始めなので3からスタートする 57 for i in range(6): #コードは0,1,2,3,4,5,6,7の中でスタート位置から探索しなくていい点があるので6コ 58 startpoint = zahyo_list[m]#座標リストの探索開始する点を設定 59 tansakupoint = startpoint + c[(i+sagasihajime)%8]#探索開始する点+(i+3)%8を行い探索する 60 y = tansakupoint[0]#zahyo_listリスト0の要素の要素 61 x = tansakupoint[1]#zahyo_listリスト1の要素の要素 62 num = a[y,x]#numにa[y,x]を格納する 63 checkbangou = num_list[m] 64 #print(checkbangou) 65 #print(num) 66 if checkbangou == num: 67 img[y,x,:] = [0,255,0] 68 p_old = [y,x] 69 #print(p_old) 70 newzahyo = p_old 71 #print(newzahyo) 72 #p_old.append([y,x]) 73 #c_numnext = (i+sagasihajime)%8 74 #print(startpoint) 75 break 76c_numnext = (i+sagasihajime)%8 77#print(c_numnext) 78#print(checkbangou) 79#print(c[(i+sagasihajime)%8]) 80#print((i+sagasihajime)%8) 81#print(p_new) 82#print(c_numnext) 83#3つ目以降の座標 84for m in range(1,len(zahyo_list)+1): 85 pstart = zahyo_list[m-1] 86 #print(pstart) 87 while np.all(pstart != newzahyo): 88 #print(newzahyo) 89 #c_num = []#コードの何番だったのかを記憶するリスト 90 for i in range(6): 91 c_num = (c_numnext+i)%8#コードが何番目に移行したかを記憶する 92 #print(c_num) 93 p_now = p_old + c[c_num]#中心座標を記憶する 94 #print('p_now : {}'.format(p_now)) 95 y = p_now[0] 96 x = p_now[1] 97 num = a[y,x]#numにa[y,x]を格納する 98 checkbangou = num_list[m-1] 99 #print(checkbangou) 100 #print(num) 101 #print('c[c_num] : {}'.format(c[c_num])) 102 #print('c_num : {}'.format(c_num)) 103 #print(c_numnext) 104 if checkbangou == num: 105 img[y,x,:] = [255,0,0] 106 c_numnext = c_num 107 p_old = p_now 108 #print('p_old : {}'.format(p_old)) 109 newzahyo = p_now 110 #print('newzahyo : {}'.format(newzahyo)) 111 break 112 113 #newzahyo_list = p_now 114#print(newzahyo_list) 115 116 #print(num) 117 #print(tansakupoint) 118 #print(startpoint) 119 120cv2.imwrite('./imagea.png',img)
試したこと
停止条件を変えたり、したのですが、欲しい実行結果が得られなかった。
補足情報(FW/ツールのバージョンなど)
windows10
Anaconda Python3.7.10