在一周的奇数天,我几乎可以理解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) ORB 在图像边缘附近找不到关键点,我不明白为什么。SIFT 和 SURF 似乎更糟糕,我预计情况恰恰相反。
如果我理解正确,那么 SIFT/SURF 在测试点周围分别使用 16x16 和 20x20 方块,因此我希望它们不会找到距离边缘 8 和 10 像素的关键点。FAST/ORB 在测试点周围使用直径为 7 的圆,因此我希望它能找到更接近边缘的关键点,也许接近 4 个像素(尽管我认为相关的算法,BRIEF,用于描述关键点使用更大的窗口)所以这会删除一些关键点)。
一个实验让我的预测变得毫无意义。在我的实验中,距边缘的最小距离随着方块的大小和间距而变化,但例子是
谁能解释为什么?
我使用的代码如下。我画了一个正方形网格并应用了高斯模糊。我预计算法会锁定角落,但他们发现了正方形的中心和一些伪影。
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) 我无法理解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)