【问题标题】:How to concatenate images of different shapes using python and opencv?如何使用python和opencv连接不同形状的图像?
【发布时间】:2018-04-25 13:01:47
【问题描述】:

我有一些图像(比如 5 个),每个图像都有不同的形状。我想为我的项目报告连接成一个图像。你能提供一个使用opencv和python的简单方法吗?

生成的图像类似于下图。

在 numpy 中,我尝试了类似的方法,但它只适用于两个图像。

r = np.concatenate((images[1][:, :, 1], images[1][:, :, 3]), axis=1)

【问题讨论】:

    标签: python numpy opencv matplotlib opencv3.0


    【解决方案1】:

    要获得您在屏幕截图中显示的结果可能需要更多的修改,但简单地将图像堆叠在一起可以像这样完成:

    import cv2
    import numpy as np
    
    image_names = ['original_field_1_0.PNG','original_field_1_1.PNG','original_field_1_3.PNG','original_field_1_4.PNG','original_field_1_5.PNG']
    images = []
    max_width = 0 # find the max width of all the images
    total_height = 0 # the total height of the images (vertical stacking)
    
    for name in image_names:
        # open all images and find their sizes
        images.append(cv2.imread(name))
        if images[-1].shape[1] > max_width:
            max_width = images[-1].shape[1]
        total_height += images[-1].shape[0]
    
    # create a new array with a size large enough to contain all the images
    final_image = np.zeros((total_height,max_width,3),dtype=np.uint8)
    
    current_y = 0 # keep track of where your current image was last placed in the y coordinate
    for image in images:
        # add an image to the final array and increment the y coordinate
        final_image[current_y:image.shape[0]+current_y,:image.shape[1],:] = image
        current_y += image.shape[0]
    
    cv2.imwrite('fin.PNG',final_image)
    

    基本思想是首先找到图像的总大小,然后创建一个该大小的数组,最后将这些范围内的像素设置为每个单独图像的像素,同时向下迭代(或横向迭代,取决于你想要什么)。

    您还可以在想要开始另一行或另一列时实现阈值。

    【讨论】:

      【解决方案2】:

      我修改了代码使其成为一个简单的功能,可能对其他人有用。

      def get_one_image(images):
              img_list = []
              padding = 200
              for img in images:
                  img_list.append(cv2.imread(img))
              max_width = []
              max_height = 0
              for img in img_list:
                  max_width.append(img.shape[0])
                  max_height += img.shape[1]
              w = np.max(max_width)
              h = max_height + padding
      
              # create a new array with a size large enough to contain all the images
              final_image = np.zeros((h, w, 3), dtype=np.uint8)
      
              current_y = 0  # keep track of where your current image was last placed in the y coordinate
              for image in img_list:
                  # add an image to the final array and increment the y coordinate
                  final_image[current_y:image.shape[0] + current_y, :image.shape[1], :] = image
                  current_y += image.shape[0]
              cv2.imwrite('out.png', final_image)
      

      【讨论】:

        【解决方案3】:

        @ajayramesh 解决方案的这种修改对我有用。此函数接收图像列表并输出单个图像,其中所有输入图像垂直堆叠:

        def get_one_image(img_list):
            max_width = 0
            total_height = 200  # padding
            for img in img_list:
                if img.shape[1] > max_width:
                    max_width = img.shape[1]
                total_height += img.shape[0]
        
            # create a new array with a size large enough to contain all the images
            final_image = np.zeros((total_height, max_width, 3), dtype=np.uint8)
        
            current_y = 0  # keep track of where your current image was last placed in the y coordinate
            for image in img_list:
                # add an image to the final array and increment the y coordinate
                image = np.hstack((image, np.zeros((image.shape[0], max_width - image.shape[1], 3))))
                final_image[current_y:current_y + image.shape[0], :, :] = image
                current_y += image.shape[0]
            return final_image
        

        【讨论】:

          猜你喜欢
          • 2020-06-07
          • 1970-01-01
          • 2015-08-06
          • 1970-01-01
          • 2022-06-15
          • 2021-11-23
          • 1970-01-01
          • 2020-12-05
          • 2020-01-30
          相关资源
          最近更新 更多