如何将图像分成块并使用opencv合并回去?

时间:2019-03-15 03:15:26

标签: python opencv

如何将图像划分为块并使用opencv合并回去。我已经将图像划分为块,但是我没有获得如何通过重复数据删除将其合并回去。 这是我的将图像划分为块的代码

   `import time
    import cv2
    import numpy as np
    from hashlib import md5
    hashs=[] 
    def compute_image_path(path):
      img=cv2.imread(path)
      #img=cv2.resize(img,(512,512))
      print(img.shape)
      print(img.size/1024)
      start=time.time()
      imgs=np.split(img,8,axis=0)
       for i,ix in enumerate(imgs):
        ig=np.split(ix,8,axis=1)
         for j,iy in enumerate(ig):
           if(j==1):
              cv2.imshow(str(i*8+j),iy)

     cv2.imwrite("C:\\Users\\prave\\Desktop\\Comp\\"+str(i*8+j)+".jpg",iy)
        hashs.append(md5(iy.tostring()).hexdigest())                   
       end=time.time()
       print(end-start)
       print(len(hashs))
       print(len(set(hashs)))    
       cv2.waitKey(0)
       print(hashs[0])
       print(hashs[1])      
       if __name__ == "__main__":
        #img=np.zeros((512,512,3))
        #img[:200,:,0]=100
        #img[200:400,:,1]=100
        #img[400:,:,2]=100
        #cv2.imshow("input",img)        
        #cv2.waitKey(0)
        compute_image_path("C:\\Users\\prave\\Desktop\\IMG_2849.jpg")`

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是使用numpy.block,它将块堆叠在一起:

import numpy as np

# 20x20 image
img = np.random.randint(0,9,(20,20))

# List of 4 5x20 image slices
sliced = np.split(img,4,axis=0)

# List of 4 lists of 4 5x5 image blocks
blocks = [np.split(img_slice,4,axis=1) for img_slice in sliced]

# stacking them back together
img_stacked = np.block(blocks)

# testing if the stacking works right
print((img==img_stacked).all())

但是,仅当您具有正确顺序的列表列表时(第一个拆分轴0,然后是轴1),此方法才有效。通常,hstackvstackconcatenate可以将较小的数组(图像)组合在一起。