使用PCA查找对象的方向

时间:2017-09-08 05:37:33

标签: image-processing rotation orientation pca

image 1

image 2

我想找到所附图像中明亮物体的方向。为此,我使用了主成分分析(PCA)。

在图像1的情况下,PCA找到正确的方向,因为第一个主要组件在该方向上排列。但是,在图像2的情况下,主要成分是迷失方向的。

任何人都可以解释为什么PCA在两张图片中显示不同的结果?另外,请建议是否有其他方法来查找对象的方向。

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)

1 个答案:

答案 0 :(得分:1)

您声称仅使用白色像素。您是否检查了某些叠加渲染选择了哪些?无论如何我认为它不足以特别为你的第二个图像,因为它不包含任何完全饱和的白色像素。我会在PCA之前使用更多处理。

  1. 增强动态范围

    您当前的图像不需要此步骤,因为它们包含黑色和几乎完全饱和的白色。该步骤允许在更多样本输入图像之间统一阈值。有关详细信息,请参阅:

  2. 平滑

    这一步将显着地提高噪点的强度,使较大物体的边缘平滑(但缩小一点)。这可以通过任何 FIR 滤波器或卷积或高斯滤波来完成。有些人也使用形态学算子。

  3. 强度阈值

    这将删除较暗的像素(清晰为黑色),以便完全消除噪音

  4. 通过形态学运算符将剩余对象扩展回原来的大小

    您可以通过将生成的OBB放大几个像素来避免这种情况(数字必须从#2 平滑强度)。

  5. 现在应用OBB搜索

    您正在使用 PCA ,因此请使用它。我正在使用它:

  6. 当我用上述方法尝试你的图像时(没有#4 )我得到了这些结果:

    results

    我注意到第二张图片的另一个问题是其中没有很多白色像素。这可能会显着偏向 PCA ,尤其是在没有预处理的情况下。我会尝试通过双三次过滤放大图像并将其用作输入。可能这是你遇到的唯一问题。