Si j'ai une image comme ci-dessous, comment puis-je ajouter une bordure tout autour de l'image de sorte que la hauteur et la largeur globales de l'image finale augmentent mais que la hauteur et la largeur de l'image d'origine restent telles quelles au milieu.
Le code suivant ajoute une bordure constante de taille 10 pixels aux quatre côtés de votre image d'origine.
Pour la couleur, j'ai supposé que vous vouliez utiliser la valeur moyenne de gris de l'arrière-plan, que j'ai calculée à partir de la valeur moyenne des deux dernières lignes de votre image. Désolé, un peu codé en dur, mais montre le mode d'emploi général et peut être adapté à vos besoins.
Si vous laissez les valeurs de bordures en bas et à droite à 0, vous obtenez même une bordure symétrique.
D'autres valeurs pour BORDER_TYPE sont possibles, telles que BORDER_DEFAULT, BORDER_REPLICATE, BORDER_WRAP.
Pour plus de détails, voir: http://docs.opencv.org/trunk/d3/df2/tutorial_py_basic_ops.html#gsc.tab=
import numpy as np
import cv2
im = cv2.imread('image.jpg')
row, col= im.shape[:2]
bottom= im[row-2:row, 0:col]
mean= cv2.mean(bottom)[0]
bordersize=10
border=cv2.copyMakeBorder(im, top=bordersize, bottom=bordersize, left=bordersize, right=bordersize, borderType= cv2.BORDER_CONSTANT, value=[mean,mean,mean] )
cv2.imshow('image',im)
cv2.imshow('bottom',bottom)
cv2.imshow('border',border)
cv2.waitKey(0)
cv2.destroyAllWindows()
Essaye ça:
import cv2
import numpy as np
img=cv2.imread("img_src.jpg")
h,w=img.shape[0:2]
base_size=h+20,w+20,3
# make a 3 channel image for base which is slightly larger than target img
base=np.zeros(base_size,dtype=np.uint8)
cv2.rectangle(base,(0,0),(w+20,h+20),(255,255,255),30) # really thick white rectangle
base[10:h+10,10:w+10]=img # this works
Répondre en une seule ligne
outputImage = cv2.copyMakeBorder(
inputImage,
topBorderWidth,
bottomBorderWidth,
leftBorderWidth,
rightBorderWidth,
cv2.BORDER_CONSTANT,
value=color of border
)