zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    easyui中的combobox小知识点~~
    nodejs+express+mysql 增删改查
    建库和表的脚本.sql
    linux服务器最大连接数
    java高级主题
    java线程池ThreadPoolExecutor
    关于Future
    git rebase
    bash shell for循环
    accept()出的socket不会使用新的端口号
  • 原文地址:https://www.cnblogs.com/wangxiaobei2019/p/14816988.html
Copyright © 2011-2022 走看看