小编Hay*_*row的帖子

numpy多维索引和函数“ take”

在一周的奇数天,我几乎可以理解numpy中的多维索引。Numpy具有函数“ take”,该函数似乎可以实现我想要的功能,但是额外的好处是,我可以控制如果索引超出范围时会发生什么情况。具体来说,我有一个3维数组作为查询表来询问

lut = np.ones([13,13,13],np.bool)
Run Code Online (Sandbox Code Playgroud)

和一个2x2的3个长向量数组,用作表的索引

arr = np.arange(12).reshape([2,2,3]) % 13 
Run Code Online (Sandbox Code Playgroud)

IIUC,如果我要写的lut[arr]话,arr则被视为2x2x3的数字数组,当这些数字用作索引时,lut它们各自返回13x13的数组。这解释了原因lut[arr].shape is (2, 2, 3, 13, 13)

我可以通过写来做自己想要的

lut[ arr[:,:,0],arr[:,:,1],arr[:,:,2] ] #(is there a better way to write this?)
Run Code Online (Sandbox Code Playgroud)

现在这三个术语的作用就好像它们已被压缩以生成2x2的元组数组并lut[<tuple>]从生成单个元素lut。最终结果是2x2的条目数组lut,正是我想要的。

我已经阅读了'take'功能的文档...

此功能与“奇特”索引(使用数组索引数组)具有相同的作用;但是,如果您需要沿给定轴的元素,则使用起来会更容易。

axis:int,可选
在其上选择值的轴。

也许天真地,我认为设置axis=2我将获得三个值以用作三元组来执行查找,但是实际上

np.take(lut,arr).shape =  (2, 2, 3)
np.take(lut,arr,axis=0).shape =  (2, 2, 3, 13, 13)
np.take(lut,arr,axis=1).shape =  (13, 2, 2, 3, 13)
np.take(lut,arr,axis=2).shape =  (13, 13, 2, 2, …
Run Code Online (Sandbox Code Playgroud)

python indexing numpy multidimensional-array

5
推荐指数
2
解决办法
1774
查看次数

为什么 FAST/ORB 不擅长寻找图像边缘附近的关键点

ORB 在图像边缘附近找不到关键点,我不明白为什么。SIFT 和 SURF 似乎更糟糕,我预计情况恰恰相反。

如果我理解正确,那么 SIFT/SURF 在测试点周围分别使用 16x16 和 20x20 方块,因此我希望它们不会找到距离边缘 8 和 10 像素的关键点。FAST/ORB 在测试点周围使用直径为 7 的圆,因此我希望它能找到更接近边缘的关键点,也许接近 4 个像素(尽管我认为相关的算法,BRIEF,用于描述关键点使用更大的窗口)所以这会删除一些关键点)。

一个实验让我的预测变得毫无意义。在我的实验中,距边缘的最小距离随着方块的大小和间距而变化,但例子是

  • SIFT .. 5 像素
  • 冲浪.. 15 像素
  • ORB .. 39 像素

谁能解释为什么?

我使用的代码如下。我画了一个正方形网格并应用了高斯模糊。我预计算法会锁定角落,但他们发现了正方形的中心和一些伪影。

import numpy as np
import cv2

size = 501; border = 51; step = 10
image = np.zeros( (size,size), np.uint8 )
# fill with disjoint squares
def drawsquare(img,i,j):
    restsize = step//5
    cv2.rectangle(img,(i-restsize,j-restsize),(i+restsize,j+restsize),255,-1)
for i in range(0,size,step):
    for j in range(0,size,step):
        drawsquare(image,i,j)
# blank out the …
Run Code Online (Sandbox Code Playgroud)

python opencv feature-extraction keypoint

5
推荐指数
1
解决办法
2114
查看次数

将转换矩阵应用于opencv中的点列表(Python)

我无法理解cv2.transform的文档。有人会怜悯并解释一下吗(在Python中)?

我有绘制多边形,将其填充并旋转图像的代码

import numpy as np  
import cv2

dx,dy = 400,400
centre = dx//2,dy//2
img = np.zeros((dy,dx),np.uint8)

# construct a long thin triangle with the apex at the centre of the image
polygon = np.array([(0,0),(100,10),(100,-10)],np.int32)
polygon += np.int32(centre)

# draw the filled-in polygon and then rotate the image
cv2.fillConvexPoly(img,polygon,(255))
M = cv2.getRotationMatrix2D(centre,20,1) # M.shape =  (2, 3)
rotatedimage = cv2.warpAffine(img,M,img.shape)
Run Code Online (Sandbox Code Playgroud)

我想先旋转多边形然后再绘制

# this is clumsy, I have to extend each vector,
# apply the matrix to each extended …
Run Code Online (Sandbox Code Playgroud)

python opencv

3
推荐指数
1
解决办法
6399
查看次数