を使用してオブジェクトの向きを探します。この目的のために、主成分分析(PCA)を使用しました。
イメージ1の場合、最初の主成分がその方向にアライメントされるため、PCAは正しい向きを見つけます。しかし、画像2の場合、主成分は方向を変える。
PCAが2つの画像で異なる結果を表示している理由は誰でも説明できますか?また、オブジェクトの向きを見つけるための他の方法があるかどうかを提案してください。
import os
import gdal
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import skimage
from skimage.filters import threshold_otsu
from skimage.filters import try_all_threshold
import cv2
import math
from skimage import img_as_ubyte
from skimage.morphology import convex_hull_image
import pandas as pd
file="path to image file"
(fileRoot, fileExt)= os.path.splitext(file)
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
geotransform = ds.GetGeoTransform()
[cols, rows] = arr.shape
thresh = threshold_otsu(arr)
binary = arr > thresh
points = binary>0
y,x = np.nonzero(points)
x = x - np.mean(x)
y = y - np.mean(y)
coords = np.vstack([x, y])
cov = np.cov(coords)
evals, evecs = np.linalg.eig(cov)
sort_indices = np.argsort(evals)[::-1]
evec1, evec2 = evecs[:, sort_indices]
x_v1, y_v1 = evec1
x_v2, y_v2 = evec2
scale = 40
plt.plot([x_v1*-scale*2, x_v1*scale*2],
[y_v1*-scale*2, y_v1*scale*2], color='red')
plt.plot([x_v2*-scale, x_v2*scale],
[y_v2*-scale, y_v2*scale], color='blue')
plt.plot(x,y, 'k.')
plt.axis('equal')
plt.gca().invert_yaxis()
plt.show()
theta = np.tanh((x_v1)/(y_v1)) * 180 /(math.pi)
オリジナルの画像は 'tiff'形式で、地理座標情報を持っていたため、 'arr'という配列の画像を読むために 'gdal'が使用されていました。しかし、添付された画像は 'png'形式であり、配列で直接読み取ることができます。気をつけてください。前もって感謝します! –
私はあなたのコードを正しく理解していれば、画像内のすべての点を使って、主な白い部分だけでなく向きを得ることができます。 –
は点密度の問題のようです... 2番目の画像オブジェクトは非常に小さく、ノイズポイントは比較的大きな密度で分散していますので、** PCA **のオブジェクトポイントを選択しなかった場合、結果は歪みます... btw if約** OBB **で十分です。[複数の曲線のOBBを計算する方法](https://stackoverflow.com/a/42997918/2521214) – Spektre