空间域图像增强:OpenCV快速图像边缘滤波算法
由于前面 [空间域图像增强:OpenCV边缘保留滤波算法] 中的高斯双边模糊和
mean shift
均值模糊计算量都很大,因此无法实时地实现图像边缘保留滤波,这大大限制了它们的使用场景,
OpenCV
中实现了一种快速的图像边缘保留滤波算法。
高斯双边滤波和均值迁移滤波在进行边缘保留滤波计算的时候除了考虑R,G,B
三个维度的值,还会考虑空间中X
和Y
这两个坐标维度,这导致了这两种滤波算法的计算量较大。而快速边缘保留滤波算法通过等价变换到低纬度空间,从而实现了数据降维与快速计算。
OpenCV
中的快速图像边缘滤波算法C++ api
如下:
void edgePreservingFilter(InputArray src,
OutputArray dst,
int flags = 1,
float sigma_s = 60,
float sigma_r = 0.4f);
其中sigma_s
取值范围是0 ~ 200,sigma_r
取值范围是0 ~ 1。当sigma_s
取值不变时,sigma_r
取值越大,则图像滤波效果越明显;当sigma_r
取值不变时,sigma_s
取值越大,则图像模糊效果越明显。
使用默认的参数值,sigma_s
= 60, sigma_r
= 0.4f:
edgePreservingFilter(input,gsBlur_output,1, 60, 0.4f);
使用sigma_s = 60
, sigma_r
= 0.7f:
edgePreservingFilter(input,gsBlur_output,1, 60, 0.7f);
使用sigma_s
= 80, sigma_r
= 0.4f:
edgePreservingFilter(input,gsBlur_output,1, 80, 0.4f);
快速边缘保留滤波算法的计算时间:
double start_time = getTickCount();
edgePreservingFilter(input,Blur_output,1, 150, 0.8f);
double run_time = (getTickCount() - start_time) / getTickFrequency();
cout << "blur time:" << run_time << endl;
经过测试:
- 快速边缘保留滤波算法计算时间为1.24749s。