【pyqt5+opencv】如何将大量图片合成一张图

@

如何制作一张包含无数小图的图片

  • 效果展示
    在这里插入图片描述
    在这里插入图片描述

主要步骤

    1. 搜集图片,需要大量图片,最好各种颜色都有,可以从百度图片爬;
    1. pyqt5 搭建界面与主要按钮
    1. OpenCV获取图像,对比图片相似度,进行替换
    1. 展示处理过程,保存图片

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. 展示过程,保存图片

  • 处理过程显示如下
    在这里插入图片描述

——20210603更新

图像透明度

  • 图像处理完毕后,利用OpenCV中的 cv2.addWeighted进行图像融合,实现透明度更改功能
result_img = cv2.addWeighted(cut_img,self.merge_alpha,self.one_picture[y:y+self.resize_,x:x+self.resize_],1- self.merge_alpha,0,-1)

在这里插入图片描述

资源下载

请多多支持
https://download.csdn.net/download/wangxiaobei2017/19360796

原文地址:https://www.cnblogs.com/wangxiaobei2019/p/14816988.html