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

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

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

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

Q&A

解決済

3回答

414閲覧

座標格納リストの計数処理(4個以上の連番の最小と最大を連続取得)

ques346

総合スコア47

Python

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

0グッド

0クリップ

投稿2021/06/22 07:12

python

1img = Image.open("drive/My Drive/mnist_dataset/alpha.jpg") 2img = img.resize((40, 40)) 3 4img = img.convert('L') 5img = img.point(lambda x: 1 if x > 128 else 0) 6img = np.asarray(img) 7 8img = np.asarray(img) 9 10np.set_printoptions(threshold=10000) 11 12print(img) 13 14print(list(zip(*np.where(img == 1))))
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (0, 11), (0, 12), (0, 13), (0, 14), (0, 15), (0, 16), (0, 17), (0, 18), (0, 19), (0, 20), (0, 21), (0, 22), (0, 23), (0, 24), (0, 25), (0, 26), (0, 27), (0, 28), (0, 29), (0, 30), (0, 31), (0, 32), (0, 33), (0, 34), (0, 35), (0, 36), (0, 37), (0, 38), (0, 39), (1, 0), (1, 1), (1, 3), (1, 4), (1, 5), (1, 10), (1, 11), (1, 12), (1, 16), (1, 17), (1, 21), (1, 22), (1, 23), (1, 27), (1, 28), (1, 33), (1, 34), (1, 35), (1, 36), (1, 37), (1, 38), (1, 39), (2, 0), (2, 1), (2, 4), (2, 5), (2, 8), (2, 11), (2, 13), (2, 14), (2, 15), (2, 16), (2, 17), (2, 19), (2, 20), (2, 22), (2, 23), (2, 25), (2, 26), (2, 27), (2, 28), (2, 30), (2, 31), (2, 32), (2, 33), (2, 35), (2, 36), (2, 37), (2, 38), (2, 39), (3, 0), (3, 1), (3, 2), (3, 4), (3, 5), (3, 8), (3, 10), (3, 11), (3, 13), (3, 14), (3, 15), (3, 16), (3, 17), (3, 19), (3, 20), (3, 22), (3, 23), (3, 25), (3, 26), (3, 27), (3, 28), (3, 30), (3, 31), (3, 32), (3, 33), (3, 34), (3, 35), (3, 36), (3, 37), (3, 38), (3, 39), (4, 0), (4, 2), (4, 3), (4, 4), (4, 5), (4, 10), (4, 11), (4, 13), (4, 14), (4, 15), (4, 16), (4, 17), (4, 19), (4, 20), (4, 22), (4, 23), (4, 27), (4, 28), (4, 33), (4, 34), (4, 35), (4, 36), (4, 37), (4, 38), (4, 39), (5, 0), (5, 2), (5, 5), (5, 8), (5, 9), (5, 11), (5, 13), (5, 14), (5, 15), (5, 16), (5, 17), (5, 19), (5, 20), (5, 22), (5, 23), (5, 25), (5, 26),・・・中略・・・]

この出力結果(名前が分からない、座標がリストになったもの)の、各成分が条件を満たすようなものを数えたりしたいのですが、
例えば、まず第一成分?(x座標?)の値によって、分け、
次に、各第一成分集合について、第二成分が4個以上連番となっている座標の内、最小と最大の値を取得する(2つ以上ある場合は、リスト等にして、全て取得)コードなどを書きたいのですが
(具体的には、(4,1),(4,3),(4,5),(4,6),(4,7),(4,8),(4,9),(4,50)・・・等となっていれば、
5から9までは、第二成分が連番となっていて、しかも5個以上であるので、最小である5と最大である9を取得する、これを、繰り返す)
座標にしない方が良かったのでしょうか・・・?どのようにするのでしょうか。

ちなみに、ここを参考にしました。
https://note.nkmk.me/python-numpy-unique/

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

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

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

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

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

guest

回答3

0

何度も変形するコードになりますがご参考まで(Python 3.8以降)

Python

1lst = [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (0, 11), (0, 12), (0, 13), (0, 14), (0, 15), (0, 16), (0, 17), (0, 18), (0, 19), (0, 20), (0, 21), (0, 22), (0, 23), (0, 24), (0, 25), (0, 26), (0, 27), (0, 28), (0, 29), (0, 30), (0, 31), (0, 32), (0, 33), (0, 34), (0, 35), (0, 36), (0, 37), (0, 38), (0, 39), (1, 0), (1, 1), (1, 3), (1, 4), (1, 5), (1, 10), (1, 11), (1, 12), (1, 16), (1, 17), (1, 21), (1, 22), (1, 23), (1, 27), (1, 28), (1, 33), (1, 34), (1, 35), (1, 36), (1, 37), (1, 38), (1, 39), (2, 0), (2, 1), (2, 4), (2, 5), (2, 8), (2, 11), (2, 13), (2, 14), (2, 15), (2, 16), (2, 17), (2, 19), (2, 20), (2, 22), (2, 23), (2, 25), (2, 26), (2, 27), (2, 28), (2, 30), (2, 31), (2, 32), (2, 33), (2, 35), (2, 36), (2, 37), (2, 38), (2, 39), (3, 0), (3, 1), (3, 2), (3, 4), (3, 5), (3, 8), (3, 10), (3, 11), (3, 13), (3, 14), (3, 15), (3, 16), (3, 17), (3, 19), (3, 20), (3, 22), (3, 23), (3, 25), (3, 26), (3, 27), (3, 28), (3, 30), (3, 31), (3, 32), (3, 33), (3, 34), (3, 35), (3, 36), (3, 37), (3, 38), (3, 39), (4, 0), (4, 2), (4, 3), (4, 4), (4, 5), (4, 10), (4, 11), (4, 13), (4, 14), (4, 15), (4, 16), (4, 17), (4, 19), (4, 20), (4, 22), (4, 23), (4, 27), (4, 28), (4, 33), (4, 34), (4, 35), (4, 36), (4, 37), (4, 38), (4, 39), (5, 0), (5, 2), (5, 5), (5, 8), (5, 9), (5, 11), (5, 13), (5, 14), (5, 15), (5, 16), (5, 17), (5, 19), (5, 20), (5, 22), (5, 23), (5, 25), (5, 26)] 2 3# 辞書形式に変形して 4dic = {n:[t[1] for t in lst if t[0] == n] for n in list({t[0] for t in lst})} 5# 連続部分を抽出し 6dic = {k:[v[i] for i in range(len(v)) 7 if i < len(v)-1 and v[i] == v[i+1]-1 or i > 0 and v[i] == v[i-1]+1] 8 for k,v in dic.items()} 9# 連続部分毎に階層化 10dic = {k:[v[n:(n:=i+1)] for i in range(sz) if i < sz-1 and v[i] != v[i+1]-1 or i == sz-1] 11 for k,v in dic.items() if (n:=0) or (sz:=len(v))} 12# 4個以上連番部分の最小と最大を抽出 13seq_n = 4 14dic = {k:[(v[n][0],v[n][-1]) for n in range(len(v)) if len(v[n]) >= seq_n] 15 for k,v in dic.items()} 16print(dic) # {0: [(0, 39)], 1: [(33, 39)], 2: [(13, 17), (25, 28), (30, 33), (35, 39)], 3: [(13, 17), (25, 28), (30, 39)], 4: [(2, 5), (13, 17), (33, 39)], 5: [(13, 17)]}

投稿2021/06/23 08:56

lehshell

総合スコア1147

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

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

ques346

2021/06/23 10:48

こ・・・これはちょっと難しいかもしれない・・・。
guest

0

ベストアンサー

自分でやるなら座標にはしませんね

なにはともあれ思うような処理を書いてみて、わからないところがあれば聞くのがいいのでは?

ところで、画像を二値化して1行ずつ最も長い白(もしくは黒)の両端の座標を取り出してどうするんでずか?
それがわかれば、こうしたほうがいいんじゃないかとうような意見が出るかもしれません。

投稿2021/06/22 10:15

TakaiY

総合スコア12830

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

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

ques346

2021/06/22 11:26

じゅあ for np.where(img[i] == 0)) これ使いますかね、 白で囲まれた長方形画像情報を取り出したいです、複数。
TakaiY

2021/06/22 13:29

img は2次元だから imp[i][j] ですね。 白で囲まれた部分を取りだしたいのであれば、点をたどって探索したほうが効率的じゃないかな。 画像だとすると、長方形ってところが気になりますね。いびつになった形をどれくらい許容するかとか、難しいと思いますね。
ques346

2021/06/22 15:26 編集

np.where使わずに、if,for等をimg[i][j]に用いるということでしょうか・・・?? for i in range(40): for j in range(36): if img[i][j] == 1 and img[i][j+1] == 1 and img[i][j+2] and img[i][j+3] == 1 and img[i][j+4] == 1: print(j) こんな感じでしょうか・・・? いびつな形になった場合は、縦、横の各の最大もしくは平均を使って、無理やり長方形を作ります。
ques346

2021/06/23 02:50

また、 a = [[]] for i in range(40): for j in range(36): if (img[i][j] == 0 and img[i][j+1] == 0 and img[i][j+2] and img[i][j+3] == 0 and img[i][j+4] == 1 and img[i][j+3] == 1 and img[i][j+4] == 1) or (img[i][j] == 0 and img[i][j+1] == 0 and img[i][j+2] and img[i][j+3] == 0 and img[i][j+4] == 1 and img[i][j+3] == 1 and img[i][j+4] == 1): print(j+2) a[i].append(j+2) for i in range(39): for j in range(40): if (a[i+1][j]-2 <= a[i][j] <= a[i+1][j]+4): print(j+2) a[i][j+1]-a[i][j] とすると、 if (a[i+1][j]-2 <= a[i][j] <= a[i+1][j]+4): でエラーが出ます、なぜでしょう、このi,jの数値39,40を30,30とか1,1とかに変更してもエラー出ます。
TakaiY

2021/06/23 04:09

a = [[]] では、 a[0][0]しか用意されないからです。 全ての数を事前に用意するか、appendでaに追加するかですね。
ques346

2021/06/23 10:51 編集

そもそもaじゃおかしいですね・・・imgにしないと for i in range(40): for j in range(36): if (img[i][j] == 0 and img[i][j+1] == 0 and img[i][j+2] and img[i][j+3] == 0 and img[i][j+4] == 1 and img[i][j+3] == 1 and img[i][j+4] == 1) or (img[i][j] == 0 and img[i][j+1] == 0 and img[i][j+2] and img[i][j+3] == 0 and img[i][j+4] == 1 and img[i][j+3] == 1 and img[i][j+4] == 1): print(j+2) a[i].append(j+2) for i in range(39): for j in range(39): if (img[i+1][j]-2 <= img[i][j] <= img[i+1][j]+4): print(j+2) img[i][j+1]-img[i][j] とりあえずここまで作りました、白→黒または黒→白となっている部分のインデックスを取り出し、 そのインデックスが、上下で差がなければ、繋がっているものと見なして・・・ といった感じです。 またこれをRでも作りたい・・・。
guest

0

pandasを使うと以下のような感じでできます。

Python

1 2import pandas as pd 3data = [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (0, 10), (0, 11), (0, 12), (0, 13), (0, 14), (0, 15), (0, 16), (0, 17), (0, 18), (0, 19), (0, 20), (0, 21), (0, 22), (0, 23), (0, 24), (0, 25), (0, 26), (0, 27), (0, 28), (0, 29), (0, 30), (0, 31), (0, 32), (0, 33), (0, 34), (0, 35), (0, 36), (0, 37), (0, 38), (0, 39), (1, 0), (1, 1), (1, 3), (1, 4), (1, 5), (1, 10), (1, 11), (1, 12), (1, 16), (1, 17), (1, 21), (1, 22), (1, 23), (1, 27), (1, 28), (1, 33), (1, 34), (1, 35), (1, 36), (1, 37), (1, 38), (1, 39), (2, 0), (2, 1), (2, 4), (2, 5), (2, 8), (2, 11), (2, 13), (2, 14), (2, 15), (2, 16), (2, 17), (2, 19), (2, 20), (2, 22), (2, 23), (2, 25), (2, 26), (2, 27), (2, 28), (2, 30), (2, 31), (2, 32), (2, 33), (2, 35), (2, 36), (2, 37), (2, 38), (2, 39), (3, 0), (3, 1), (3, 2), (3, 4), (3, 5), (3, 8), (3, 10), (3, 11), (3, 13), (3, 14), (3, 15), (3, 16), (3, 17), (3, 19), (3, 20), (3, 22), (3, 23), (3, 25), (3, 26), (3, 27), (3, 28), (3, 30), (3, 31), (3, 32), (3, 33), (3, 34), (3, 35), (3, 36), (3, 37), (3, 38), (3, 39), (4, 0), (4, 2), (4, 3), (4, 4), (4, 5), (4, 10), (4, 11), (4, 13), (4, 14), (4, 15), (4, 16), (4, 17), (4, 19), (4, 20), (4, 22), (4, 23), (4, 27), (4, 28), (4, 33), (4, 34), (4, 35), (4, 36), (4, 37), (4, 38), (4, 39), (5, 0), (5, 2), (5, 5), (5, 8), (5, 9), (5, 11), (5, 13), (5, 14), (5, 15), (5, 16), (5, 17), (5, 19), (5, 20), (5, 22), (5, 23), (5, 25), (5, 26)] 4df = pd.DataFrame(data, columns=['x','y']) 5 6# 連続部分にグループ番号を振る 7df = df.sort_values(['x','y']) 8df_prev = df.shift(1) 9ret = ~((df['x'] == df_prev['x']) & (df['y'] == df_prev['y'] + 1)) 10ret[0] = False 11df['grp_no'] = ret.cumsum() 12 13# グループ番号ごとにx値、連続個数、最大、最小値を得る 14df = df.groupby('grp_no').agg( {'x':['min','size'], 'y':['min','max']}).reset_index(drop=True) 15df.columns = ["_".join(x) for x in df.columns.ravel()] 16 17# 4連続以上 18df = df[df['x_size'] >= 4][['x_min','y_min','y_max']].rename(columns={'x_min':'x'}) 19print(df) 20""" 21 x y_min y_max 220 0 0 39 237 1 33 39 2412 2 13 17 2515 2 25 28 2616 2 30 33 2717 2 35 39 2822 3 13 17 2925 3 25 28 3026 3 30 39 3128 4 2 5 3230 4 13 17 3334 4 33 39 3440 5 13 17 35"""

投稿2021/06/22 09:23

can110

総合スコア38278

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

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

ques346

2021/06/22 09:26

新たなパッケージpandas使わないと無理ですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問