如何过滤图像中给定宽度的线条
How to filter given width of lines in a image?
我需要过滤图像中给定宽度的线条。
我正在编写一个程序来检测道路图像的线条。我发现了类似的东西,但无法理解其中的逻辑。我的功能必须做到这一点:我将发送图像和行宽度的像素大小(例如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*开始,然后从该值减去其两侧距离τ处的像素。接下来,这两个像素的绝对差也从中减去。最后,在存储在输出图像中之前,它被限制在0…255的范围内。
如果你有一个图像:
0011100
该卷积将使中心1获得值:
2 * 1
- 0
- 0
- abs(0 - 0)
= 2
第一个"1"将变为:
2 * 1
- 0
- 1
- abs(0 - 1)
= 0
第三个"1"也是如此(它是镜像)。
当然,0的值将始终保持零或变为负,这将被限制为0。
这是一个相当奇怪的过滤器。它在同一行上取三乘三的像素值,间隔为τ。将这些值设为Vl、V和Vr。
滤波器计算-Vl+2V-Vr,可以看作二阶导数,并推导|Vl-Vr|,可以看作一阶导数(也称为梯度)。二阶导数在最大配置(Vl<V>Vr)的情况下给出最大响应;在对称配置(Vl=Vr)的情况下,一阶导数给出最小响应。
因此,全局滤波器将给出对称最大值的最大响应(就像在黑暗背景上的浅色道路,垂直的,宽度小于2τ)
通过重新排列这些项,你可以看到滤波器也产生了左梯度和右梯度中最小的一个,V-Vm和V-Vp(箝位为零)。
相关文章:
- 为什么 gcc 会给我可能未初始化的警告 deque::insert 带有过滤范围
- 通过C++从目录中过滤特定文件类型
- boost::hana:为什么我无法过滤集?
- Mellanox上的DPDK IPv4流过滤
- 使用 QT C++过滤大数据的最佳方式
- 如何过滤avl树的数据
- 在张量中过滤多维视图
- 如何使用 pcap.h c++ 按 ip 过滤
- 在编译时使用 gnu++11 过滤值列表,不使用 stdlib(Arduino 环境)
- 如何让集合 in C++过滤掉指向相同值的不同指针
- 有没有办法通过过滤进程的名称来自动终止进程?
- 按扩展名过滤搜索文件会返回太多结果
- DSP过滤用于流媒体
- 如何在C 中过滤字符串向量
- 提升::astar_search 在过滤后的图表上
- 从特征匹配/单应性中过滤掉误报 – OpenCV
- 与层的冲突过滤 (PhysX 3.4)
- 使用qfilesystemmodel和qsortFilterProxymodel子类过滤特定文件夹的文件
- QT和SQLITE:使用数组的元素过滤
- 过滤期间,在树视图中扩展特定项目