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

Posted 昊虹图像算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV中LineTypes各枚举值(LINE_4 LINE_8 LINE_AA )的含义相关的知识,希望对你有一定的参考价值。

在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平滑得多,即抗锯齿性能好。

以上是关于OpenCV中LineTypes各枚举值(LINE_4 LINE_8 LINE_AA )的含义的主要内容,如果未能解决你的问题,请参考以下文章

opencv中LINE_4和LINE_8的区别?

Python下opencv使用笔记(简单几何图像绘制)

opencv绘图

详解OpenCV的线段绘制函数line()

图像的 OpenCV Line-Mod 问题

Pytohn OpenCV 绘图函数