在OpenCV中凡是与绘图有关的函数几乎都要涉及到这个LineTypes参数的设置。比如说函数line()、函数putText()、函数drawContours()、函数rectangle()等。
在OpenCV4.1.2的官方文档中,LineTypes有以下枚举值:
从中我们可以看出,有四个枚举值,分别为FILLED 、LINE_4 、LINE_8 、LINE_AA 。
其中FILLED并没有说明,说明这个枚举值应该没啥作用。
下面介绍LINE_4 、LINE_8 、LINE_AA的含义。
这几个值是用来确定线条生成算法的。我们知道一个线段实际上是由许多个像素点构成的。以绘制线段为例,当确定了线段的两个端点后,其实就可以确定线段中间那些点的坐标了。那么中间这些点的坐标是怎么计算出来的呢?那就是用相关的算法计算出来的。
在OpenCV中我们就可以用LINE_4 、LINE_8 、LINE_AA来指定具体是用哪些算法来计算出中间这些点的坐标。
LINE_4表示使用的算法计算出的属于线段上的像素点,相邻的两点之间只有四个方向。
LINE_8表示使用的算法计算出的属于线段上的像素点,相邻的两点之间只有八个方向。
LINE_AA表示使用的算法计算出的属于线段上的像素点,相邻的两点之间是大于八个方向的,比如十六个、三十二个之类的。具体是多少个,就得去看研究算法的源代码了,
LINE_AA在上面的解释中为“antialiased line”,意思为抗钜齿线。LINE_4和LINE_8是属于钜齿线的,为什么LINE_4和LINE_8是属于钜齿线呢?因为它们的方向很有限啊,LINE_8有八个方向,LINE_4只有四个方向。方向分辨率有限,那绘制出来的线条形状自然像钜齿了。
注意:要区分四连通域和八连通域与这里的LINE_4和LINE_8和区别。一个像素上下左右的四个像素点称为其四连通域,一个像素上、下、左、右、西北、东北、西南、东南的像素称为其八连通域。显然,如果我们要扩大像素与其相邻点形成的角度个数,那么就得扩大连通域,比如我们可以称下面这个为点P的5×5-1=24连通域,只是P点与其24连通域中的点并一定是相连的。
接下来,看一个示例代码,来体会下这几种LineTypes在效果上的区别。
# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理开发需求也请联系博主
# 图像处理技术交流QQ群 271891601
import cv2
import numpy as np
str1 = 'WR'
thick = 3
Scale = 6
img_LINE_4 = np.zeros((300, 300, 3), dtype='uint8')
cv2.putText(
img=img_LINE_4,
text=str1,
org=(20, 150),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=Scale,
color=(0, 255, 0),
thickness=thick,
lineType=cv2.LINE_4)
cv2.imshow('LINE_4', img_LINE_4)
img_LINE_8 = np.zeros((300, 300, 3), dtype='uint8')
cv2.putText(
img=img_LINE_8,
text=str1,
org=(20, 150),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=Scale,
color=(0, 255, 0),
thickness=thick,
lineType=cv2.LINE_8)
cv2.imshow('LINE_8', img_LINE_8)
img_LINE_AA = np.zeros((300, 300, 3), dtype='uint8')
cv2.putText(
img=img_LINE_AA,
text=str1,
org=(20, 150),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=Scale,
color=(0, 255, 0),
thickness=thick,
lineType=cv2.LINE_AA)
cv2.imshow('LINE_AA', img_LINE_AA)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下:
从运行结果我们可以看出,LINE_4和LINE_8区别不大,但明显能感觉到LINE_AA比LINE_4和LINE_8平滑得多,即抗锯齿性能好。