2017-09-08 3 views
0

image 1Trouver l'orientation de l'objet à l'aide PCA

image 2

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) 
+0

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! –

+0

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. –

+0

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

Répondre

0

Vous prétendez que vous utilisez uniquement des pixels blancs. Avez-vous vérifié quels sont ceux qui sont sélectionnés par un rendu de superposition? En tout cas je ne pense pas que cela soit suffisant surtout pour votre deuxième image car elle ne contient aucun pixel blanc complètement saturé. J'utiliserais plus de traitement avant la PCA.

  1. améliorer dynamique

    vos images actuelles n'a pas besoin de cette étape car ils contiennent à la fois noir et presque complètement saturé blanc. Cette étape permet d'unifier les valeurs de seuil entre plusieurs images d'entrée d'échantillon. Pour plus d'informations, voir:

  2. lisser un peu

    cette étape significative amant l'intensité des points de bruit et lisser les bords des objets plus gros (mais les réduire une bit). Ceci peut être fait par n'importe quel filtre FIR ou par convolution ou par filtrage gaussien. Certains utilisent également des opérateurs de morphologie pour cela.

  3. seuil par intensité

    cela supprimer les pixels les plus sombres (claires à noir), donc le bruit est complètement enlevé

  4. agrandir les objets restant par les opérateurs de morphologie retour à l'ancien taille

    Vous pouvez éviter cela en agrandissant l'OBB résultant de quelques pixels (le nombre est lié à la force lisse de # 2).

  5. appliquent maintenant OBB recherche

    Vous utilisez PCA afin de l'utiliser.J'utilise ceci:

Quand j'ai essayé vos images avec l'approche ci-dessus (sans # 4) Je suis arrivé ces résultats:

results

Un autre problème que j'ai remarqué avec votre deuxième image est qu'il n'y a pas beaucoup de blanc pixels dedans. Cela peut biaiser le PCA de manière significative en particulier sans pré-traitement. Je voudrais essayer d'agrandir l'image par filtrage bicubique et l'utiliser comme entrée. Peut-être que c'est le seul problème que vous avez avec lui.

+0

Similaire à votre suggestion, j'ai utilisé une coque convexe (de skimage.morphology) sur l'image seuillée otsu pour agrandir l'objet comme étape de pré-traitement. Dans ce cas également, PCA ne fonctionne pas. –

+0

que peut-être vous avez un problème avec l'interprétation de PCA. Il vous donne des composants principaux qui n'ont pas besoin d'être l'orientation de l'objet lui-même dans certains cas. Pouvez-vous partager des images d'entrée prétraitées et une orientation erronée? Cela pourrait éclairer cela. De toute façon, vous pouvez toujours utiliser une approche géométrique comme je le fais à la place. Bien que la précision soit limitée à la taille des tables angulaires initiales, elle peut être améliorée de manière récursive sans avoir besoin de traiter toute la plage du cercle. – Spektre