実現したいこと
下記の画像のように羅列された数字の中から周りの数字よりも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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー