Trouver l'orientation de l'objet à l'aide PCA
Je veux trouver l'orientation de l'objet lumineux dans les images jointes. À cette fin, j'ai utilisé l'analyse en composantes principales (ACP).
Dans le cas de l'image 1, PCA trouve une orientation correcte lorsque le premier composant principal est aligné dans cette direction. Cependant, dans le cas de l'image 2, les composants principaux sont désorientés.
Quelqu'un peut-il expliquer pourquoi la PCA montre des résultats différents dans les deux images? Aussi, s'il vous plaît suggérer s'il y a une autre méthode pour trouver l'orientation de l'objet.
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)
Les images originales étaient au format 'tiff' et avec des coordonnées géographiques, dans ce but 'gdal' est utilisé pour lire l'image dans un tableau 'arr'. Cependant, les images attachées sont au format 'png', qui peut être lu directement dans un tableau. S'il vous plaît prendre soin de. Merci d'avance! –
Si je comprends bien votre code, utilisez tous les points de l'image pour obtenir l'orientation et pas seulement pour la zone blanche principale. –
ressemble à un problème de densité de point ... deuxième objet image est beaucoup plus petit et les points de bruit sont dispersés avec une densité relativement grande, donc si vous n'avez pas sélectionné les points d'objet pour ** PCA ** alors vos résultats sont déformés ... btw environ ** OBB ** suffit, vous pouvez l'utiliser [Comment calculer l'OBB de plusieurs courbes?] (https://stackoverflow.com/a/42997918/2521214) – Spektre