为啥使用 cv::line 函数绘制的不同线条具有不同的透明度 (alpha) 级别?

Posted

技术标签:

【中文标题】为啥使用 cv::line 函数绘制的不同线条具有不同的透明度 (alpha) 级别?【英文标题】:Why different lines drawn using cv::line function has different transparency (alpha) levels?为什么使用 cv::line 函数绘制的不同线条具有不同的透明度 (alpha) 级别? 【发布时间】:2015-06-28 06:49:27 【问题描述】:

我使用 houghLines 变换来检测图像中的线条,并使用 cv::line() 函数在单独的 Mat 图像上绘制检测到的线条。 请注意,由 houghLinesP 检测到的线条通常相互重叠且数量较多。 (即使图像中有 1 行,它也会检测相邻行的数量)

for (size_t i = 0; i < lines.size(); i++)

    Vec4i l = lines[i];
    line(src, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 255, 0), 10, CV_AA);

我想用没有任何透明度的纯绿色绘制线条。但在生成的图像中,我注意到边缘的一些线条是透明的。 (或线条的边界模糊)以下是我生成的图像的一部分。

我想避免这种情况。我希望线条有锋利的边缘,并且不应该有任何透明度。怎么做?

【问题讨论】:

根本没有透明度。您正在使用 CV_AA 标志进行绘图,因此它会尝试进行抗锯齿。如果您不喜欢结果,请跳过 CV_AA 标志。 @berak 我删除了那个标志。但结果和以前一样。 您在观看图像之前保存为 jpeg 吗?尝试无损压缩方法(例如 png)。 是的,我保存在 jpeg 中。这就是问题所在。当我以 .png 格式保存图像时,问题解决了。谢谢 【参考方案1】:

CV_AA 标志告诉cv::line() 绘制一条AA 连接线。这是透明线边框像素的来源。 如果您删除 CV_AA 标志,线条将被绘制成锯齿状,但没有透明胶片 (Bresenham)。

更仔细地观察图像,在彩色区域内有可见的 JPG 伪影(零星的较暗点)。这些工件不存在于内存中的图像中,但会出现在 JPG 保存的文件中。尝试将图像保存为 PNG。

【讨论】:

我删除了那个标志。但结果和以前一样。 @SamithaChathuranga:在这种情况下,这是一个错误。再次尝试重建您的代码。如果你仍然看到这个,试着写一个小程序,用你使用的参数画一条线,看看它是否发生。如果您可以重现此错误,那么您应该将其作为错误提交给 OpenCV 项目。如果没有,请在此处评论问题所在。 我这样做了,但问题仍然存在。 啊哈!事实上,将您的图像保存为 PNG 而不是 JPG。 JPG 是一种有损压缩格式,确实会导致这种类型的伪影。 PNG 是无损的,不会添加伪像。此外,Windows 照片查看器会进行双线性插值以“提高”缩放图像的显示质量。 这就是问题所在。当我以 .png 格式保存图像并删除 CV_AA 标志时,问题解决了。谢谢

以上是关于为啥使用 cv::line 函数绘制的不同线条具有不同的透明度 (alpha) 级别?的主要内容,如果未能解决你的问题,请参考以下文章

cv2.line()函数

在图片上绘制图形和添加文字

Opencv+Python:在Opencv中绘制函数

opencv中的绘图函数

5opencv中的绘图函数

Python-OpenCV 中的绘图函数