计算blob的方向

计算blob 方向有两种方法:一种是利用PCA;一种是利用图像矩。

本次主要介绍基于PCA算法的计算:

1、  点矩阵

我们将处理的二维点大小为2*m,第一行为x,第二行为y

2、  每个点减去均值

计算x坐标的行数。对于每个x点,减去它的均值。对y坐标做同样的处理。平均减法最小化了近似数据和中心数据的均方误差。

3、  计算协方差 2*2

4、  特征值与特征向量计算

5、  特征向量重排序,特征值大的对应的特征向量是方差最大的方向】

6、  绘制主成分

7、  计算旋转角度长轴与水平方向的角


8、   绘制旋转后的 blob

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from scipy.misc.pilutil import imread 
#import skimage.filter
img = imread(r'C:\Users\Y\Desktop\blob_axes-skewed_oval.png', flatten=1)
#img=255-img
y, x = np.nonzero(img)
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]
x_v1, y_v1 = evecs[:, sort_indices[0]]  # Eigenvector with largest eigenvalue
x_v2, y_v2 = evecs[:, sort_indices[1]]
scale = 20
x1=np.linspace(-10,10,30)
y1=x1*y_v1/x_v1
#plt.plot([x_v1*-scale, x_v1*scale],
#         [y_v1*-scale, y_v1*scale], color='red')
plt.plot(x1,y1,'r-')
#plt.plot([x_v2*-scale, x_v2*scale],
#         [y_v2*-scale, y_v2*scale], color='blue')
x2=np.linspace(-10,10,30)
y2=x2*y_v2/x_v2
plt.plot(x2,y2,'b-')
theta = np.arccos(y_v1/np.sqrt(x_v1**2+y_v1**2)) #与水平方向的夹角
#theta=np.arctan(y_v1/x_v1)+np.pi*2
rotation_mat = np.matrix([[np.cos(theta), -np.sin(theta)],
                      [np.sin(theta), np.cos(theta)]])
transformed_mat = rotation_mat * coords
# plot the transformed blob
x_transformed, y_transformed = transformed_mat.A
plt.plot(x_transformed, y_transformed, 'g.')
plt.plot(x, y, 'k.')
plt.axis('equal')
plt.gca().invert_yaxis()  # Match the image system with origin at top left
plt.show()

原图:

实验后的图


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值