如何制作一张包含无数小图的图片
- 效果展示
主要步骤
-
- 搜集图片,需要大量图片,最好各种颜色都有,可以从百度图片爬;
-
- pyqt5 搭建界面与主要按钮
-
- OpenCV获取图像,对比图片相似度,进行替换
-
- 展示处理过程,保存图片
1. 搜集图片
- 本例通过对百度图片进行爬取,获取600张图片
- 选择一张最终要呈现的图片,最好分辨率高一些
2.搭建操作显示界面
- 左边是图像显示区,动态显示整个处理过程
- 右边是操作区,需要选择小图的文件夹,和需要处理的大图图片
-
像素尺度
是小图的像素值,图片类型
是最终保存图片的类型,【注】保存的图片会存储在大图相同路径下 -
启动
按钮开始处理图片,过程中可以暂停处理,也会保存图片
3. OpenCV图像操作
- 首先将所有小图批量resize到指定尺寸,获取RGB各通道的像素和
- 循环大图,依次和小图进行对比,获取RGB各通道的差值的绝对值并求和,查找小图中差值最小的一张图
- 将差值最小的图覆盖到原图上
def get_rgb_list(self):
imgs_name = []
imgs_B = []
imgs_G = []
imgs_R = []
for n in os.listdir(self.imgs_file):
if n.split(".")[-1] in ['bmp','png','jpg']:
try:
origin_img = cv2.resize(cv2.imread(os.path.join(self.imgs_file,n)),(self.resize_,self.resize_))
imgs_B.append(origin_img[:,:,0].sum())
imgs_G.append(origin_img[:,:,1].sum())
imgs_R.append(origin_img[:,:,2].sum())
imgs_name.append(os.path.join(self.imgs_file,n))
except:
print("image read reeor {}".format(n))
print("Get image name list!")
return (imgs_name,imgs_B,imgs_G,imgs_R)
def compare_rgb(self,imgs_rgb,img_region):
# 通过对比三个通道的值 求和 得到最小值
diff_b = abs(imgs_rgb[1] - img_region[:,:,0].sum())
diff_g = abs(imgs_rgb[2] - img_region[:,:,1].sum())
diff_r = abs(imgs_rgb[3] - img_region[:,:,2].sum())
diff_rgb = list(diff_b + diff_g + diff_r)
tmp_index = diff_rgb.index(min(diff_rgb))
same_pic = cv2.resize(cv2.imread(imgs_rgb[0][tmp_index]),(self.resize_,self.resize_))
return same_pic
for x in range(0,self.one_picture.shape[1],self.resize_):
if x+self.resize_ > self.one_picture.shape[1]: break
for y in range(0,self.one_picture.shape[0],self.resize_):
if y+self.resize_ > self.one_picture.shape[0]: break
cut_img = self.compare_rgb(images_rgb,self.one_picture[y:y+self.resize_,x:x+self.resize_])
self.one_picture[y:y+self.resize_,x:x+self.resize_] = cut_img
self.tmp_count += 1
if self.stop_flag: break
if self.stop_flag: break
4. 展示过程,保存图片
- 处理过程显示如下
资源下载
请多多支持
https://download.csdn.net/download/wangxiaobei2017/19120188
后期优化
- 增加视频输出,记录动态过程