OpenCV入门(五)快速学会OpenCV4文字绘制&边界填充
OpenCV入门(五)快速学会OpenCV4文字绘制&边界填充
作者:Xiou
1.文字绘制
OpenCV中除了提供绘制各种图形的函数外,还提供了一个特殊的绘制函数,即在图像上绘制文字。
这个函数是putText(),它是命名空间cv2中的函数,
函数声明如下:
putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[,
bottomLeftOrigin]]])
其中,参数
img表示待绘制的图像;
text表示待绘制的文字;
org表示文本框的左下角;
fontFace表示字体;fontScale表示尺寸因子,值越大文字越大;
color表示字体的颜色(RGB);
thickness表示线条宽度;
lineType表示线型(4邻域或8邻域,默认8邻域);
bottomLeftOrigin如果为True,那么图像数据原点位于左下角,否则位于左上角。
绘制文字案例:
import cv2
import numpy as np
img = np.zeros([512, 512, 3], dtype=np.uint8)
for i in range(512):
for j in range(512):
img[i, j, :] = [i % 256, j % 256, (i + j) % 256]
info = 'Hello World'
font_face = cv2.FONT_HERSHEY_COMPLEX
font_scale = 2
thickness = 2
text_size = cv2.getTextSize(info, font_face, font_scale, thickness)
print(text_size)
p_center = (int(512 / 2 - text_size[0][0] / 2), int(512 / 2 - text_size[0][1] / 2))
cv2.putText(img, info, p_center, font_face, font_scale, (255,255,255), thickness)
cv2.imshow('res', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
首先通过两个for循环有规律地改变了像素值,这样可以模拟实现色彩渐变的效果。然后通过函数getTextSize得到要画文字的大小,这样可以计算出显示文字的位置。最后通过文本绘制函数putText画出一段字符串"Hello World"。
运行工程,结果如图所示:
2.边界填充
在OpenCV中,可以使用函数copyMakeBorder为图像设置边界。
该函数可以为图像定义额外的填充(边框),原始边缘的行或列被复制到额外的边框中。
该函数声明如下:
cv.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])
其中,参数
src表示输入图像,即原图像;
top、bottom、left、right分别表示在原图像的4个方向上扩充多少像素;
borderType表示边界类型,取值如下:
· BORDER_REPLICATE:复制法,复制最边缘像素,填充扩充的边界,。中值滤波就是采用的这种方法。
· BORDER_REFLECT_101:反射法,以最边缘像素为轴,对称填充,。这是高斯滤波边界处理的默认方法。
· BORDER_CONSTANT:常量法,以一个常量像素值(参数value)填充扩充的边界。这种方式在仿射变换、透视变换中非常常见。
· BORDER_REFLECT:和对称法原理一致,不过最边缘像素也要对称过去。
· BORDER_WRAP:用另一侧元素来填充这一侧的扩充边界。
参数value默认值为0,当borderType取值为BORDER_CONSTANT时,这个参数表示边界值。
dst表示输出图像,和原图像有一样的深度,大小为Size(src.cols + left +right, src.rows + top+ bottom)。
原图:
2.1 复制法
import cv2 as cv
img = cv.imread("test.jpg")
# 填充像素
top_size = 50
bottom_size = 50
left_size = 50
right_size = 50
# Replicate (复制法)
replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv2.BORDER_REPLICATE)
cv.imshow("replicate", replicate)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果:
2.2 反射法
代码实例:
import cv2 as cv
img = cv.imread("test.jpg")
# 填充像素
top_size = 50
bottom_size = 50
left_size = 50
right_size = 50
# Replicate (复制法)
replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv.BORDER_REFLECT)
cv.imshow("replicate", replicate)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果:
2.3 外包法
外包法: 用相反位置对图片进行包裹。
实例代码:
import cv2 as cv
img = cv.imread("test.jpg")
# 填充像素
top_size = 50
bottom_size = 50
left_size = 50
right_size = 50
# Replicate (复制法)
replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv.BORDER_WRAP)
cv.imshow("replicate", replicate)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果:
2.4 常量法
常量法: 用常数值填充. 需要设置一个 value 值,代表填充的颜色。
实例代码:
import cv2 as cv
img = cv.imread("test.jpg")
# 填充像素
top_size = 50
bottom_size = 50
left_size = 50
right_size = 50
# Replicate (复制法)
replicate = cv.copyMakeBorder(img, top_size, bottom_size, left_size, right_size, borderType=cv.BORDER_CONSTANT, value=0)
cv.imshow("replicate", replicate)
cv.waitKey(0)
cv.destroyAllWindows()
输出结果: