前言
我相信很多同学看到我这个题目都很懵逼啊,心里面想的肯定是:嗯???我直接在win下面复制粘贴不就完事了吗???。
我不采用这种方式有两个原因
第一个是我就很想用python,感觉单纯复制粘贴不能完全解决问题,万一图片超级多呢。
其次,就是不用文件夹下面的图片名字都一样,例如第一个文件夹下面有一个’1.png’,第二个文件夹下面也有一个一样名字的文件,所以复制粘贴的时候就会被替换掉。
因此我选择用python来解决这个问题。
参考
本文感谢以下参考部分:
np.concatenate() 使用说明
思路
思路如下:
- 读取每一个文件夹下面的图片,并将其转变为np.array的形式
- 将这些np.array合并成一个大的array
- 以opencv的方式将大array里面的数值按图片的形式保存
代码
需要用到的包
import glob
import cv2
import numpy as np
定义路径
combine_path = [ 'path1/*',
'path2/*',
'path3/*',
'path4/*',
'path5/*']
result_path = 'result_path'
没有别的要强调的,注意一下combine_path里面,图片下面有图片的话后面加个/*就好了
打开文件下的图片
def open_image(path1):
img_path = glob.glob(path1)
return np.array([cv2.imread(true_path) for true_path in img_path])
array的结合
def matrix_combine(np_list):
length = len(np_list)
for i in range(1,length):
if i == 1:
result = np.concatenate([np_list[i-1],np_list[1]],axis=0)
else:
result = np.concatenate([result,np_list[i]],axis=0)
return result
这里需要强调的部分就是,我的axis设置为0,这里我的shape长这样:[n,h,w,c]其中,n是图片数量,h和w是图片宽和高,c是图片通道,我结合的目的是为了让图片结合,所以选择的axis=0,用的时候可能就这里需要注意一下吧
主函数
sum = len(combine_path)
name = []
for i in range(sum):
name.append(open_image(combine_path[i]))
res = matrix_combine(name)
for i, img in enumerate(res):
cv2.imwrite(result_path+str(i)+'.bmp',img)
这里我保存图片,重新命名了一遍,命名出来的效果是’1.bmp’这种的
完整代码方便复制粘贴
import glob
import cv2
import numpy as np
combine_path = [ 'path1/*',
'path2/*',
'path3/*',
'path4/*',
'path5/*']
result_path = 'result_path'
def open_image(path1):
img_path = glob.glob(path1)
return np.array([cv2.imread(true_path) for true_path in img_path])
def matrix_combine(np_list):
length = len(np_list)
for i in range(1,length):
if i == 1:
result = np.concatenate([np_list[i-1],np_list[1]],axis=0)
else:
result = np.concatenate([result,np_list[i]],axis=0)
return result
sum = len(combine_path)
name = []
for i in range(sum):
name.append(open_image(combine_path[i]))
res = matrix_combine(name)
for i, img in enumerate(res):
cv2.imwrite(result_path+str(i)+'.bmp',img)
总结
感谢阿果同学,网管同学
防火防盗防诈骗