之前在跑神经网络时,输入原图位3m左右的图像出现了超内存的情况,现在很多模型对于图像处理的输入大小都有限制,本菜鸟暂时还不知道有什么办法可以解决,百度了一下发现可以将图片裁剪分块处理并拼接起来,我之后也试了一下,发现有点效果,所以来记录一下。
核心思路时通过 for 循环历遍图像xy轴像素,历遍的单位为图像块的大小,这个时可以自己设置的
block_size = 512
rows,cols,_ = org_image.shape
for y in range(0,rows,block_size):
for x in range(0,cols,block_size):
接下来是对于像素处理的防止越界以及图像历遍中的分块部分
width = min(block_size,cols-x)
height = min(block_siae,rows-y)
block = org_img[y:y+height,x:x+width].copy()
再后面就是处理图像的算法处理与图像拼接
hsv = cv2.cvtColor(block,cv2.COLOR_BGR2HSV)
process_img[y:y+height,x:x+width] = hsv
为了避免缝隙,我们添加一个判断语句
if hsv.shape != (block.shape[0],block.shape[1],3):
hsv = cv2.resize(hsv,(block.shape[1],block.shape[0]))
我们处理图像之后发现图像拼接完之后会出现边界现象十分严重的问题,如下图
我查了百度了一下解决办法,有一种 overlap 的方法能够缓解这个问题就试了一下,代码很简单,只要改动 for 循环中的步长参数就行
overlap = 20
for y in range(0,rows,block_size-overlap):
for x in range(0,cols,block_szie-overlap):
处理出的图片效果如下所示:
好像并没有什么用(😂😂😂😂😂),只是改变的拼接的位置,看来菜鸟还得继续找别的方法解决这个问题了。
下面附上完整的代码以供参考
import cv2
import numpy as np
def block_seg(inputPath,outputPath):
original_image = cv2.imread(inputPath)
if original_image is None:
print("Could not read the image.")
return
block_size = 512
rows,cols ,_ = original_image.shape
overlap = 40
process_image = np.zeros_like(original_image)
process_gray = cv2.cvtColor(process_image,cv2.COLOR_BGR2GRAY)
for y in range(0,rows,block_size - overlap):
for x in range(0,cols,block_size - overlap):
width = min(block_size,cols - x)
height = min(block_size,rows - y)
roi = (x,y,x + width,y + height)
block = original_image[y:y+height,x:x+width].copy()
# process_image algorithm
gray = cv2.cvtColor(block,cv2.COLOR_BGR2GRAY)
hist= cv2.equalizeHist(gray)
# avoid the block gap
if hist.shape != (block.shape[0],block.shape[1],1):
hist = cv2.resize(hist,(block.shape[1],block.shape[0]))
process_gray[y:y+height,x:x+width] = hist
cv2.imwrite(outputPath, process_gray)
注:菜鸟的前面的代码中有一个对原始图像灰度化的处理是因为我图像算法处理的方法时在灰度图片下进行的,如果处理图片时彩色的可以删掉这一步,并改一下通道数;