>我正在尝试将图像拆分为较小图像的网格,以便我可以单独处理每个小图像。为此,我意识到我必须将每个小图像定义为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]
将是左上角的补丁,依此类推。