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

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

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

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

Q&A

1回答

858閲覧

画像の輪郭に色を付けたい

raioto1013

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/05/28 04:08

前提・実現したいこと

画像の輪郭線をたどり、輪郭を色を付け、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

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

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

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

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

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

m2l

2021/05/30 00:28

無限ループになるとのことでしたがこのあたりとかエラーになっていませんか? > num not in s1_list
guest

回答1

0

欲しい結果が少しわかりませんが、
while の条件ならびにnpで条件分岐している部分を下記に変えると
背景:黒、形の中身:緑、輪郭:赤という形で出力されました。
(npyデータなどがなかったので画像データは適当に用意して試してみました。)

import cv2 import numpy as np from PIL import Image import time if __name__ == "__main__": start = time.time() image = Image.open("/server/test.png") data = np.asarray(image) #numpy形式で保存 np.save("/server/test.npy", data) a=np.load('/server/test.npy') s1_list = [] #1,2を記憶するための空リストの作成 row = a.shape[0] #行 col = a.shape[1] #列 num_list = [] #1,2の先頭リスト zahyo_list = [] #1,2の先頭座標[j,i]を格納するためのリスト newzahyo = [0,0] arr_zahyo = [] c_numnext = [] c = np.array([[0,1],#0 [-1,1],#1 [-1,0],#2 [-1,-1],#3 [0,-1],#4 [1,-1],#5 [1,0],#6 [1,1]])#7 for j in range(row): #行の要素 for i in range(col):#列の要素 num = a[j,i] #リストの番号がi,jの時に0,1,2のどれかを格納する if np.any(num): num_list.append(num) #numリストにnumを追加する zahyo_list.append([j,i]) #zahyoリストにnumがどこの座標にあったかを追加する s1_list.append(num) # s1_listをnumにする img = cv2.imread('/server/test.png',cv2.IMREAD_COLOR) #1つ目の座標 for k in range(len(num_list)): #numリストの要素k print("1: ", k) y = zahyo_list[k][0] #numリスト0の要素の要素 x = zahyo_list[k][1] #numリスト1の要素の要素 img[y,x,:] = [0,0,255] #先頭リストを赤く染める #2つ目の座標 for m in range(len(zahyo_list)):#zahyo_lsit分だけmを回す print("2: ", m) sagasihajime = 3 #探し始めなので3からスタートする for i in range(6): #コードは0,1,2,3,4,5,6,7の中でスタート位置から探索しなくていい点があるので6コ startpoint = zahyo_list[m]#座標リストの探索開始する点を設定 tansakupoint = startpoint + c[(i+sagasihajime)%8]#探索開始する点+(i+3)%8を行い探索する y = tansakupoint[0]#zahyo_listリスト0の要素の要素 x = tansakupoint[1]#zahyo_listリスト1の要素の要素 num = a[y,x]#numにa[y,x]を格納する checkbangou = num_list[m] if np.any(num): img[y,x,:] = [0,255,0] p_old = [y,x] newzahyo = p_old break c_numnext = (i+sagasihajime)%8 for m in range(1,len(zahyo_list)+1): print("3: ", m) pstart = zahyo_list[m-1] while np.all(pstart == newzahyo): for i in range(6): print("4: ", newzahyo, pstart) c_num = (c_numnext+i)%8#コードが何番目に移行したかを記憶する p_now = p_old + c[c_num]#中心座標を記憶する y = p_now[0] x = p_now[1] num = a[y,x]#numにa[y,x]を格納する checkbangou = num_list[m-1] if np.any(num): img[y,x,:] = [255,0,0] c_numnext = c_num p_old = p_now newzahyo = p_now break cv2.imwrite('/server/imagea.png',img) elapsed_time = time.time() - start print("elapsed_time:{0}".format(elapsed_time) + "[sec]")

投稿2021/05/30 00:38

m2l

総合スコア318

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問