2017-04-13 8 views
1

lは異なるサイズの画像のセットを持っています(45,50,3), (69,34,3), (34,98,3)。 lは次のようにこれらのイメージにパディングを追加したい:画像にパディングを追加して同じ形状にします

は、画像全体の最大幅と長さを取り、その大きさに画像を入れ

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) 

すべてのように、どのようにlはOpenCVのにパディングを追加することができますイメージは同じサイズになりますか?例では、Lは、画像が(69,98,3)

EDIT1: 

ましょう仮定するリットルの形状を取得します与えた形状(49,39,3)lは(80,60,3)に変換したいということでイメージを持っています。 input_image寸法:{幅= 49、heigh = 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) - size値を使用して、各画像にパディングを追加することができます。 bordertypeは、これらのいずれかとすることができる。

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

copyMakeBorder tutorial

+0

どのようにして、左下の値の左上と右上の値を取得できますか?私はimage.shapeから得ることができる幅と長さを持っています – vincent

+0

@vincent _ "最大(サイズ) - 画像のサイズ値を使用できます" _ – Miki

+0

あなたは左または上にのみ値を追加したり、幅と長さの値をすべての方向に返します。次のように:top = length/2、bottom = length/2、left = width/2、right = width/2 –

関連する問題