OpenCV中LineTypes各枚举值(LINE_4 、LINE_8 、LINE_AA )的含义

在OpenCV中凡是与绘图有关的函数几乎都要涉及到这个LineTypes参数的设置。比如说函数line()、函数putText()、函数drawContours()、函数rectangle()等。

在OpenCV4.1.2的官方文档中,LineTypes有以下枚举值:

OpenCV中LineTypes各枚举值(LINE_4 、LINE_8 、LINE_AA )的含义
从中我们可以看出,有四个枚举值,分别为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连通域中的点并一定是相连的。

OpenCV中LineTypes各枚举值(LINE_4 、LINE_8 、LINE_AA )的含义

接下来,看一个示例代码,来体会下这几种LineTypes在效果上的区别。


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

运行结果如下:

OpenCV中LineTypes各枚举值(LINE_4 、LINE_8 、LINE_AA )的含义
从运行结果我们可以看出,LINE_4和LINE_8区别不大,但明显能感觉到LINE_AA比LINE_4和LINE_8平滑得多,即抗锯齿性能好。

Original: https://blog.csdn.net/wenhao_ir/article/details/125535836
Author: 昊虹AI笔记
Title: OpenCV中LineTypes各枚举值(LINE_4 、LINE_8 、LINE_AA )的含义

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/637621/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球