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

标签 c++ opencv math image-processing detection

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

我正在编写一个程序来检测道路图像的线条。我发现了类似的东西,但无法理解它的逻辑。我的功能必须这样做: 我将根据像素大小(例如 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/

相关文章:

c++ - 稳定c++中的值

javascript - HTML5 Canvas - 计算对象相对于 'magnet' 的速度

c++ - 如何在 C++ 中重新分配?

python - 如何手动设置关键点和提取特征

java - 错误,还是用户错误?在裁剪后的 Mat Image 上创建边框不会正确渲染最右边的边框线

c++ - 基于 OpenCV C++ 光流的分割代码抛出异常

algorithm - 四面体边缘测试

c++ - 在 MinGW 中使用线程?

c++ - 如何在 C++ 中检查控制台已满?

c++ - 我将如何创建一个允许我定义具有多个值的多个对象的结构?