目录
一、环境
本文使用环境为:
- Windows10
- Python 3.9.17
- opencv-python 4.8.0.74
二、原理
cv.copyMakeBorder
是OpenCV库中的一个函数,用于在图像周围添加边框(padding)。这个函数可以用于图像的预处理、增强等任务。它的基本语法如下:
cpp
dst = cv.copyMakeBorder(src, top, bottom, left, right, borderType, value)
src
:输入图像,可以是彩色或灰度图像。top
、bottom
、left
和right
:分别表示上、下、左、右方向上的边框宽度。如果设置为负数,则表示自动计算边框宽度。borderType
:边框类型,可以是上述提到的任意一种类型。value
:边框的颜色值。对于彩色图像,需要提供一个包含三个元素的元组(例如:(0, 0, 0)表示黑色);对于灰度图像,需要提供一个单一的数值(例如:0表示黑色)。
其中,cv.copyMakeBorder
支持以下几种边框类型:
cv.BORDER_CONSTANT
:常数填充,即用一个固定的值填充边框。cv.BORDER_REFLECT
:反射填充,即用图像边界的像素值进行填充。cv.BORDER_REFLECT_101
:反射填充,与cv.BORDER_REFLECT
类似,但使用不同的边界像素值。cv.BORDER_WRAP
:循环填充,即用图像边界的像素值进行填充,形成一个环状的效果。cv.BORDER_REPLICATE
:复制填充,即用图像边界的像素值进行填充。cv.BORDER_DEFAULT
:默认填充,即用0填充边框。
三、完整代码
注:执行下面代码,图像显示后:
- 按下r是原图,
- 按下c是边界padding后的效果图,
- 按下esc退出
python
import sys
from random import randint
import cv2 as cv
def main(argv):
borderType = cv.BORDER_CONSTANT
window_name = "copyMakeBorder Demo"
src = cv.imread(cv.samples.findFile('data/lena.jpg'), cv.IMREAD_COLOR)
## [create_window]
cv.namedWindow(window_name, cv.WINDOW_AUTOSIZE)
top = int(0.05 * src.shape[0]) # shape[0] = rows
bottom = top
left = int(0.05 * src.shape[1]) # shape[1] = cols
right = left
while 1:
# 待填充的随机颜色
value = [randint(0, 255), randint(0, 255), randint(0, 255)]
dst = cv.copyMakeBorder(src, top, bottom, left, right, borderType, None, value)
cv.imshow(window_name, dst)
c = cv.waitKey(500)
if c == 27:
break
elif c == 99: # 99 = ord('c')
borderType = cv.BORDER_CONSTANT
elif c == 114: # 114 = ord('r')
borderType = cv.BORDER_REPLICATE
return 0
if __name__ == "__main__":
main(sys.argv[1:])