gpt4 book ai didi

c++ - 如何过滤图像中给定宽度的线条?

转载 作者:行者123 更新时间:2023-11-28 05:55:39 26 4
gpt4 key购买 nike

我需要过滤图像中给定宽度的线条。

我正在编写一个程序来检测道路图像的线条。我发现了类似的东西,但无法理解它的逻辑。我的功能必须这样做:我将根据像素大小(例如 30 像素宽度)发送图像线宽,该函数将仅过滤图像中的这些线。

我找到了那个代码:

void filterWidth(Mat image, int tau) // tau=width of line I want to filter
int aux = 0;
for (int j = 0; j < quad.rows; ++j)
{
unsigned char *ptRowSrc = quad.ptr<uchar>(j);
unsigned char *ptRowDst = quadDst.ptr<uchar>(j);

for (int i = tau; i < quad.cols - tau; ++i)
{
if (ptRowSrc[i] != 0)
{
aux = 2 * ptRowSrc[i];
aux += -ptRowSrc[i - tau];
aux += -ptRowSrc[i + tau];
aux += -abs((int)(ptRowSrc[i - tau] - ptRowSrc[i + tau]));

aux = (aux < 0) ? (0) : (aux);
aux = (aux > 255) ? (255) : (aux);

ptRowDst[i] = (unsigned char)aux;
}
}
}

该代码的数学解释是什么?它是如何工作的?

最佳答案

阅读有关卷积过滤器的信息。此代码是 1 维 卷积过滤器的特例(它仅与当前处理的行上的其他像素进行卷积)。

aux 的值以 2 * 当前像素值开始,然后从该值中减去距离为 tau 的两侧的像素。接下来,还从中减去这两个像素的绝对差异。最后它被限制在 0...255 的范围内,然后被存储在输出图像中。

如果你有图片:

0011100

这个卷积会导致中心1获得值:

2 * 1
- 0
- 0
- abs(0 - 0)
= 2

第一个'1'会变成:

2 * 1
- 0
- 1
- abs(0 - 1)
= 0

第三个“1”也是如此(它是镜像)。

当然,0 值将始终保持为零或变为负数,这将被限制回 0。

关于c++ - 如何过滤图像中给定宽度的线条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34202060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com