2017-04-13 37 views
1

l有一组不同大小的图像(45,50,3), (69,34,3), (34,98,3)。升要填充添加到这些图片如下:为图像添加填充以使它们形状相同

把整个图像的最大宽度和长度,然后把图像中尺寸

import os 
import glob 
import cv2 

input_path="/home/images" 
os.chdir(indput_path) 
images=glob.glob("*.png") 
Length=[] 
Width=[] 
for img in images: 
    img=cv2.imread(img) 
    width,length=img.shape[0:2] 
    Length.append(length) 
    Width.append(width) 
W=max(Width) 
L=max(Length) 

怎样才能升的OpenCV中添加填充物,使所有的图像将具有相同的大小?在例1给图像会得到(69,98,3)

EDIT1: 

让我们假设L的形状有一个图像与形状(49,39,3)使L要转换到(80,60,3): input_image尺寸:{宽度= 49,唤起注意= 39}

所以顶=高度/ 2 = 19.5

底部=高度/ 2 = 19.5

左=宽度/ 2 = 24.5

右=宽度/ 2 = 24.5

output_image尺寸:{宽度= 80,高度= 60}

顶= 30

底部= 30

左= 40

右= 40

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 
BLUE = [255,255,255] 
img1 = cv2.imread('/image.png') 
constant=cv2.copyMakeBorder(img1,30,30,40,40,cv2.BORDER_CONSTANT,value=BLUE) 
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') 
plt.subplot(233),plt.imshow(constant,'gray'),plt.title('CONSTANT') 
plt.show() 
print(constant.shape) 


(109, 119, 3) 

然而它应该是(80,60,3)

EDIT2: 

它的工作

constant= cv2.copyMakeBorder(img1,15,16,10,11,cv2.BORDER_CONSTANT,value=BLUE) 
+1

检查此链接:https://stackoverflow.com/questions/36044061/add-padding-to-object-in-4-channel-image – zindarod

+0

@ Zindarod。我有黑白图像像素只有0或255。我图像中的大多数角色都是用黑色书写的。所以我需要白色像素填充。不过,我也有一些图像的字符是白色的,所以我需要黑色像素填充。如果在开放的cv中有一个技巧来检测,然后添加白色或黑色像素填充 – vincent

+0

如果我使用cv2.resize(img,(69,98),interpolation = cv2.INTER_NEAREST)会怎么样,它会改变我的图片。我的所有图像都以中心为准字符被写入中心 – vincent

回答

3

您可以使用:

image = cv2.copyMakeBorder(src, top, bottom, left, right, borderType) 

其中src为您的源图像和顶部,博特,左,右的图像周围垫衬。

您可以在while循环中使用max(sizes) - 图像的大小值来为每个图像添加填充。 的bordertype可以是这些中的一个:

  • cv2.BORDER_CONSTANT
  • cv2.BORDER_REFLECT
  • cv2.BORDER_REFLECT_101
  • cv2.BORDER_DEFAULT
  • cv2.BORDER_REPLICATE
  • cv2.BORDER_WRAP

copyMakeBorder tutorial

+0

我该如何获得左下角和右下角的最高值。 l只有宽度和长度,我可以从image.shape – vincent

+0

@vincent _“您可以使用最大(尺寸) - 图像的大小值”_ – Miki

+0

您可以将值仅添加到左侧或顶部,或添加一半的宽度和长度值到各个方向。如:top = length/2,bottom = length/2,left = width/2,right = width/2 –