Filter

Filter

1、背景

滤波是为了提升缺陷检出率。这是因为模糊化的滤波方法都能在一定程度上降低噪声对缺陷信号的干扰,以达到更好地缺陷检出的目的。

2、滤波类型&&原理

在这里插入图片描述

考虑线性滤波:均值、高斯、passThrough,非线性滤波:Bilateral,还有用户自定义滤波。

这里重点介绍Bilateral。

2.1、Bilateral

  • 同时考虑将要被滤波的像素点的_空域信息(domain)和 值域信息(range)。空间域权重衡量了像素之间的距离,而像素值域权重衡量了像素值之间的相似性。
  • 权重优化为空间临近度计算的权值sigma_space像素值相似度计算的权值sigma_color的乘积,优化后的权值再与图像作卷积运算。从而达到保边去噪的效果。

请添加图片描述

计算公式:

g ( i , j ) = ∑ ( k , l ) ∈ S ( i , j ) f ( k , l ) w ( i , j , k , l ) ∑ ( k , l ) ∈ S ( i , j ) w ( i , j , k , l ) g(i,j)=\frac{\sum_{(k,l)\in S(i,j)}^{}f(k,l)w(i,j,k,l) }{\sum_{(k,l)\in S(i,j)}^{}w(i,j,k,l) } g(i,j)=(k,l)S(i,j)w(i,j,k,l)(k,l)S(i,j)f(k,l)w(i,j,k,l)

  1. g(i, j)代表输出点;

  2. S(i, j)的是指以(i,j)为中心的(2N+1)(2N+1)的大小的范围;

  3. f(k, l)代表(多个)输入点;(i,j)为中心

  4. w(i, j, k, l)代表经过两个高斯函数计算出的值(这里还不是权值)

2.1.1、分析w(i, j, k, l)

ws为空间临近高斯函数,wr为像素值相似度高斯函数

w = w s ∗ w r w=ws*wr w=wswr

w s = e − ( i − k ) 2 + ( j − l ) 2 2 σ s 2 w_s=e^{\frac{-(i-k)^2+(j-l)^2}{2\sigma _{s}^2 } } ws=e2σs2(ik)2+(jl)2

w r = e − ∥ f ( i , j ) − f ( k , l ) ∥ 2 2 σ r 2 w_r=e^{\frac{-\left \| f(i,j)-f(k,l) \right \|^2 }{2\sigma _{r}^2 } } wr=e2σr2f(i,j)f(k,l)2

  1. ws是计算空间相似度。这就是普通的高斯滤波函数,其代入的坐标,sigma_s是程序输入值。
  2. wr是计算像素值相似度(颜色空间)。上方分子是范数,是两个点像素值差值的绝对值的平方。

2.2.2、σ的意义及选取

空间域sigma(space)选取:

和高斯滤波一样,sigma(space)越大,图像越平滑,趋于无穷大时,每个权重都一样,类似均值滤波。

sigma(space)越小,中心点权重越大,周围点权重越小,对图像的滤波作用越小,趋于零时,输出等同于原图。

值域sigma(color)选取:

Sigma(color)越大,边缘越模糊,极限情况为simga无穷大,值域系数近似相等(忽略常数时,将近为exp(0)= 1),与高斯模板(空间域模板)相乘后可认为等效于高斯滤波。

Sigma(color)越小,边缘越清晰,极限情况为simga无限接近0,值域系数除了中心位置,其他近似为0(接近exp(-∞) = 0),与高斯模板(空间域模板)相乘进行滤波的结果等效于源图像。

3、滤波的实现

3.1、线性滤波

opencv方式

//CPU
cv::Mat kernel_mat = cv::Mat(ksize, ksize, CV_32FC1, filter_kernel);
cv::filter2D(src_F, dst_F, CV_32F, kernel_mat, cv::Point(-1, -1), cv::BORDER_REPLICATE);

//GPU
cv::Mat src = cv::imread(file_name, cv::IMREAD_GRAYSCALE);
cv::cuda::GpuMat src_F_gpu(src);
cv::cuda::GpuMat dst_F_gpu(src);
cv::Ptr<cv::cuda::Filter> linearfilter =
    cv::cuda::createLinearFilter(CV_32FC1, CV_32FC1, kernel_mat, cv::Point(-1, -1), cv::BORDER_REPLICATE);
linearfilter->apply(src_F_gpu, dst_F_gpu);

IPP方式

IppStatus ippiFilterBorderGetSize (IppiSize kernelSize, IppiSize dstRoiSize,
IppDataType dataType, IppDataType kernelType, int numChannels, int* pSpecSize, int*
pBufferSize);

IppStatus ippiFilterBorderInit_16s(const Ipp16s* pKernel, IppiSize kernelSize, int
divisor, IppDataType dataType, int numChannels, IppRoundMode roundMode,
IppiFilterBorderSpec* pSpec);

IppStatus ippiFilterBorder_<mod>(const Ipp<datatype>* pSrc, int srcStep, Ipp<datatype>*
pDst, int dstStep, IppiSize dstRoiSize, IppiBorderType border, const Ipp<datatype>
borderValue[1], const IppiFilterBorderSpec* pSpec, Ipp8u* pBuffer);

3.2、非线性滤波

bilateral

opencv方式

cv::Mat imgDiff_32f, imgDiff_32f_dst;

cv::bilateralFilter(imgDiff_32f, imgDiff_32f_dst, 3, sigma_color, sigma_space);

IPP方式

IppStatus ippiFilterBilateralBorderGetBufferSize(IppiFilterBilateralType filter,

IppiSize dstRoiSize, int radius, IppDataType dataType, int numChannels,

IppiDistanceMethodType distMethodType, int* pSpecSize, int* pBufferSize);

IppStatus ippiFilterBilateralBorderInit(IppiFilterBilateralType filter, IppiSize

dstRoiSize, int radius, IppDataType dataType, int numChannels, IppiDistanceMethodType

distMethod, Ipp32f valSquareSigma, Ipp32f posSquareSigma, IppiFilterBilateralSpec*

pSpec);

IppStatus ippiFilterBilateralBorder_<mod>(const Ipp<srcdatatype>* pSrc, int srcStep,

Ipp<dstdatatype>* pDst, int dstStep, IppiSize dstRoiSize, IppiBorderType borderType,

Ipp<datatype>* pBorderValue, IppiFilterBilateralSpec* pSpec, Ipp8u* pBuffer);

参考

https://blog.csdn.net/u013066730/article/details/87919412

https://blog.csdn.net/weixin_44457994/article/details/120426156

https://blog.csdn.net/a435262767/article/details/107115249

  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值