6.1 图像过滤
6.1.1 cv::bilateralFilter
6.1.1.1 双边滤波器简介
在图像处理上,双边滤波器为使影像平滑化的非线性滤波器。和传统的影像平滑化算法不同,双边滤波器除了使用像素之间几何上的靠近程度之外,还多考虑了像素之间的光度/色彩差异, 使得双边滤波器能够有效的将影像上的噪声去除,同时保存影像上的边缘资讯。
双边滤波器可以应用在影像降噪、色调映射、图像重照明和材质编辑。
色调映射是在有限动态范围媒介上近似显示高动态范围图像的一项7图形学技术。打印结果、CRT 或者 LCD 显示器以及投影仪等都只有有限的动态范围。 本质上来讲,色调映射是要解决的问题是进行大幅度的对比度衰减将场景亮度变换到可以显示的范围,同时要保持图像细节与颜色等对于表现原始场景非常重要的信息。 因此,双边滤波器可以借由对亮度相似区域进行模糊化之后,将高动态范围图像的梯度图像分割成亮度相似区和亮度差异较大的部分,借由改变两者的权重,而将高动态范围图像映射成可显示的有限动态范围。
6.1.1.2 Opencv接口
void cv::bilateralFilter(InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT
)
参数
src 源8位或浮点,1通道或3通道图像。
dst 与src具有相同大小和类型的目标图像。
d 过滤期间使用的每个像素邻域的直径。如果它是非正数,则从sigmaSpace计算。
sigmaColor 过滤颜色空间中的西格玛。参数的值越大意味着像素邻域内的更远的颜色(参见sigmaSpace)将混合在一起,从而产生更大的半等颜色区域。
sigmaSpace 在坐标空间中过滤西格玛。较大的参数值意味着只要它们的颜色足够接近,更远的像素就会相互影响(参见sigmaColor)。当d> 0时,无论sigmaSpace如何,它都指定邻域大小。否则,d与sigmaSpace成比例。
borderType 用于外推图像外部像素的边框模式,请参阅BorderTypes
该功能将双边滤波应用于输入图像,减少不需要的噪声,同时保持边缘相当清晰。但是,与大多数过滤器相比,它非常慢。
Sigma值:为简单起见,您可以将2 sigma值设置为相同。如果它们很小(<10),过滤器将没有太大的影响,而如果它们很大(> 150),它们将具有非常强烈的效果,使图像看起来“卡通”。
滤波器大小:大滤波器(d> 5)非常慢,因此建议对实时应用使用d = 5,对于需要大量噪声滤波的离线应用,可能需要d = 9。
void ES::ImageProcessing::bilateralOper(cv::Mat* dst)
{
Mat src = imread("lena.jpg", IMREAD_COLOR);
cv::resize(src, src, Size(src.rows / 4 * 3, src.cols / 4 * 3));
ImageProcessingParams* img_params = stat-ic_cast<ImageProcessingParams*>(m_params);
int d = img_params->m_d;//4
int sigmaColor = img_params->m_sigmaColor;//183
int sigmaSpace = img_params->m_sigmaSpace;//188
Mat mat;
cv::bilateralFilter(src, mat, d, sigmaColor, sigmaSpace);
Mat mergeMat(src.rows, src.cols + mat.cols, src.type());
Mat submat = mergeMat.colRange(0, src.cols);
src.copyTo(submat);
submat = mergeMat.colRange(src.cols, src.cols + mat.cols);
mat.copyTo(submat);
mergeMat.copyTo(*dst);
}