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

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

如果您想使用 Numpy 函数拆分图像,请查看numpy.array_split。

在你的情况下,你会写这样的东西:

z = {}
count = 0
split1 = np.array_split(img, rh)
for sub in split1:
    split2 = np.array_split(sub, rw, 1)
    for sub2 in split2:
        z[count] = sub2
        count++

出于效率目的,下面列出的是使用重塑和排列尺寸的矢量化方法。

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

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

2)主要加工部分来这里。拆分切片图像的前两个轴,以便我们通过重塑创建两个长度的新轴M每个轴。因此,剩下的两个轴将表示窗口(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)

这给了我们一个 NumPy 数组,沿第一个轴有 M^2 个元素。沿该轴的每个切片将对应于每个窗口/修补程序。因此,z[0]将是左上角的补丁,依此类推。

相关内容

  • 没有找到相关文章

最新更新