【问题标题】: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 格式保存图像时,问题解决了。谢谢

标签: c++ opencv image-processing transparency alpha


【解决方案1】:

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

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

【讨论】:

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