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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

Q&A

解決済

1回答

310閲覧

数字の羅列されたCSVファイルから、周りより数字の大きいピクセルを抜き出したい

dondol

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0グッド

0クリップ

投稿2023/09/27 11:53

編集2023/09/27 11:55

実現したいこと

下記の画像のように羅列された数字の中から周りの数字よりも5以上大きい数字(画像右側でピンクに塗られている部分)を検出したいです。

イメージ説明

イメージ説明

前提

現在のコードでは隣接するピクセルの数字との変化量を元にしているため大きい数字の集合では中心部分には変化量がなく検出できません。
内部まで含めて検出できるようにしたいです。
周りとの数字の差から飛び出ている部分を抜き出すのに適したコードを教えて欲しいです。

発生している問題・エラーメッセージ

自分で下記のコードを実行したところ次のようになりました。
輪郭の中心部分は抜き出せず、また変化量を元にしているため隣接する数字の小さいほうのピクセルも抜き出してしまっています。
上記の画像のピンク部分のように数字の大きい部分のみを抜き出したいです。

イメージ説明

イメージ説明

該当のソースコード

python

1import pandas as pd 2import numpy as np 3import cv2 4%matplotlib inline 5import matplotlib.pyplot as plt 6 7# データの形状を調べる 8Z = pd.read_csv("/content/drive/MyDrive/csv_1.txt", header=None).values 9row_count, col_count = Z.shape 10 11# 差分計算の方向を選択 12# 例: 行方向の差分計算 13diff_row = np.abs(np.diff(Z, axis=0)) 14 15# 例: 列方向の差分計算 16diff_col = np.abs(np.diff(Z, axis=1)) 17 18# 標高変化のしきい値 19threshold = 5 # 適切なしきい値を設定してください 20 21# 標高変化がしきい値を超えるピクセルの座標を取得 22indices_row = np.argwhere(diff_row > threshold) 23indices_col = np.argwhere(diff_col > threshold) 24 25# 画像の作成と輪郭抽出 26mask = np.zeros_like(Z, dtype=np.uint8) 27for idx in indices_row: 28 mask[idx[0] + 1, idx[1]] = Z[idx[0] + 1, idx[1]] # 高い方のピクセルの値を代入 29for idx in indices_col: 30 mask[idx[0], idx[1] + 1] = Z[idx[0], idx[1] + 1] # 高い方のピクセルの値を代入 31contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 32 33# 結果画像の作成と輪郭描画 34result = cv2.cvtColor(Z.astype(np.uint8), cv2.COLOR_GRAY2BGR) 35cv2.drawContours(result, contours, -1, (0, 0, 255), 2) 36 37# 結果の表示 38plt.imshow(result) 39plt.show()

実行したファイルの中身です

0,0,0,4,4,4,4,0,0,0,0,2,0,0,0 0,0,0,4,4,4,4,0,0,0,0,0,0,0,0 0,0,0,4,4,4,4,0,0,0,0,0,0,0,0 0,0,0,4,4,4,4,0,0,0,8,8,8,0,0 0,0,0,0,0,0,0,0,0,7,7,7,7,0,0 0,0,0,0,0,0,0,0,0,7,7,7,7,8,0 0,0,8,8,0,0,0,0,0,7,7,7,3,0,0 0,8,8,8,8,0,3,0,0,0,7,7,8,0,0 0,8,9,9,8,0,0,0,0,0,0,0,0,0,0 0,8,9,9,8,0,0,0,0,6,0,6,6,0,0 0,8,9,9,8,0,0,0,0,6,0,6,6,0,0 0,8,9,9,8,0,0,0,0,6,0,6,6,0,0 0,8,8,8,0,0,7,0,0,6,0,6,6,0,0 0,0,8,8,0,0,0,0,0,6,0,6,6,0,0 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,4,4,4,4,4,4,0,4,4,4,4,4,4,4 0,4,4,4,4,4,12,12,12,12,12,4,4,4,4 0,4,4,4,4,4,12,12,12,12,12,4,4,4,4 0,0,4,4,4,4,12,12,12,12,12,4,4,4,4 0,0,0,4,4,4,4,12,12,12,12,12,4,4,4 0,0,0,0,0,4,4,4,12,12,12,12,4,4,4 0,0,0,0,0,0,4,4,4,4,4,4,4,4,4 0,0,0,0,0,0,3,4,4,4,4,4,4,4,4 0,6,6,0,0,0,0,4,4,4,4,7,7,7,4 0,6,6,0,0,0,0,0,4,4,4,7,8,7,4 0,6,6,0,0,0,0,0,4,4,4,7,8,7,4 0,6,0,0,0,0,0,0,0,4,4,4,7,4,4 0,6,0,0,3,3,3,0,0,0,0,4,4,4,4 0,0,0,0,3,3,3,3,0,0,0,0,0,4,4 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

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

toge_

2023/09/27 15:34

記載いただいているルール以外に何点か補足のルールがありそうです。 私の勘違いでしょうか? 1. 「隣接」とは縦横の4セルだけではなく、斜めも含めた8セル 2. 隣接のマスの1つでも差が5以上のセルがあれば、それと隣接している同値のセルは検出する (この場合の「隣接」は縦横の4セルのみ? 例だけでは判別できない) 3. 最初の7のように同値の隣接セルがない場合は検出しない (しかしその場合、上から8セル、右から3セルの8を検出しているのが説明できない)
dondol

2023/09/27 15:49

そうですね、説明が不足していました。ありがとうございます。 1.隣接するセルは4セルでも8セルでもどちらでも問題ありませんより簡単な方と考えています。 2.連なる同値(この時1程度の数字のズレは同値として扱いたい)のピクセルはすべて検出したいと考えています。 3.7に色を塗っていないのはこの後の処理で数字がまとまっていないはずれ値を除去するというのが頭にあったため塗り忘れてしまったためです。例としては塗っておくのが適切でした。
guest

回答1

0

ベストアンサー

  1. 隣接してて同じ数字であるという条件のもと全てのマスでUnionFind
  2. 隣接してるマスで異なる数字であれば比較,差が5以上あるグループを抽出

でいけそうですね

投稿2023/09/27 12:10

PondVillege

総合スコア1579

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

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

dondol

2023/09/27 15:51

なるほど!UnionFindというものがあったのですね。 確かに初めにグループ分けした方が都合がよさそうです、ありがとうございます。
PondVillege

2023/09/28 01:41

朝目が覚めると別のやり方として 1. 左上から順に隣接マスとの差分が5未満という条件のもとflood fill(白いところを埋めていく) 2. flood fillされていないマスに対して,白でないかつ差分が5未満という条件のもとflood fill でもいけそうだと思いました.
dondol

2023/09/30 07:48

ありがとうございます!UnionFindで無事やりたいことができました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問