Numpy-如何在OpenCV python中迭代创建ROI?

混沌扭曲

我正在尝试将图像拆分为较小的图像网格,以便可以分别处理每个较小的图像。为此,我意识到必须将每个小图像定义为ROI,并且可以从那里轻松使用它。

现在,我的网格大小不固定。即,如果用户输入5,则必须制作5x5的网格。

逐像素迭代图像会很慢,因此我决定使用Numpy通过以下结构来创建ROI:

#Assuming user entered grid size =5
roiwidth=w/5
roiheight=h/5   
roi0=img[0:roiheight,0:roiwidth]

这将是我的第一篇文章。h和w分别是图像的高度和宽度。对于下一部分,我将要做:

roi1=img[0:roiheight,roiwidth+1:2*roiwidth]   

我最后的投资回报率是:

roi25=img[4*roiheight+1:5*roiheight, 4*roiwidth+1:5*roiwidth]

但是我需要反复进行,并且无法找出正确的方法。我不想逐个像素地遍历图像,而是需要它是动态的

编辑:我现在这样迭代:

import cv2
import numpy

img=cv2.imread('01.jpg')
h,w,chan=img.shape
rh=h/5
rw=w/5
z={}
count=0
for i in range (0,5):
    for j in range (0,5):
        yl=i*rh
        yh=(i+1)*rh
        xl=j*rw
        xh=(j+1)*rw
        z[count]=img[yl:yh,xl:xh]
        count=count+1

但是我不知道这是否是最有效的方法。

迪卡卡(Divakar)

为了提高效率,下面列出了一种使用重塑和置换尺寸的矢量化方法。

1)让我们定义输入参数和设置输入:

M = 5 # Number of patches along height and width
img_slice = img[:rh*M,:rw*M] # Slice out valid image data

2)主要处理部分在这里。分割切片图像的前两个轴,以便我们M通过重塑来创建两个长度分别为新的轴因此,剩下的两个轴将代表window (rh x rw)我们的最终目标是使它们彼此相邻,以便为我们提供(rh,rw)补丁,因此其他两个分割轴也将彼此相邻。为此,我们需要使用来替换尺寸np.transpose置换后,我们调整形状以合并长度的两个维度,(M,M)以便最终得到一个长度轴M^2,每个轴的元素将代表图像中的一个窗口。

所以,最后我们将有:

z = img_slice.reshape(M,rh,M,rw,-1).transpose(0,2,1,3,4).reshape(M**2,rh,rw,-1)

这使我们得到了一个N​​umPy数组,其中的M^2元素沿第一个轴。沿该轴的每个切片将对应于每个窗口/面片。因此,z[0]将是左上角的补丁,依此类推。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章