我想在所附的图像中找到明亮物体的方向。为此,我使用了主成分分析(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条答案
按热度按时间1wnzp6jl1#
你声称你只使用了白色像素。你有没有检查过哪些像素是通过叠加渲染选择的?无论如何,我认为这还不够,特别是对于你的第二张图像,因为它不包含任何完全饱和的白色像素。我会在PCA之前使用更多的处理。
*增强动态范围
您当前的图像不需要此步骤,因为它们包含黑色和几乎完全饱和的白色。此步骤允许在更多样本输入图像中统一阈值。有关更多信息,请参阅:
*光滑一点
这一步将显著降低噪声点的强度,并平滑较大对象的边缘(但会缩小一点)。这可以通过任何FIR滤波器或卷积或高斯滤波来完成。有些还使用形态学算子。
*强度阈值
这将删除较暗的像素(清晰到黑色),因此完全删除了噪声
*通过形态运算符将剩余对象放大回以前的大小
您可以通过将结果OBB放大几个像素来避免这种情况(数字与**#2**的平滑强度有关)。
*现在应用OBB搜索
你正在使用PCA,所以使用它。我使用这个代替:
当我尝试你的图像与上述方法(没有**#4**)我得到了这些结果:
我注意到你的第二张图片的另一个问题是,它没有太多的白色像素。这可能会使PCA产生明显的偏差,特别是在没有预处理的情况下。我会尝试通过双三次滤波来放大图像,并将其用作输入。可能这是你使用它的唯一问题。