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()

输出结果:

在这里插入图片描述

posted @ 2023-03-07 20:49  小幽余生不加糖  阅读(89)  评论(0编辑  收藏  举报  来源