在图像处理中,会用到对图像的平滑处理。平滑常常被用来消除图像的噪声,下面介绍几个常用于图像平滑处理的函数。
(1)blur
平滑处理常常用到的是线性滤波器。线性滤波器的数学基础建立在卷积的概念之上。对于一个线性滤波器,变换之后图像的输出值其实就是该点的某个邻域内各点输入像素值的加权求和。假如我们现在有一幅M*N的图像要进行线性滤波,我们采用的卷积核(kernel)的大小为m*n,那么处理之后的图像每一点的输出像素值由下面这个式子确定:
上面这个式子的分子其实就是源图像f(x,y)与我们所用的卷积核w做卷积运算,而分母是w中各个元素的求和结果,这样就为邻域内不同位置分配了不同的权重。需要注意的是,一旦w被确定,那么分母其实是一个常数,所以我们应该提前算出分母的值,避免直接代入上式造成的重复计算和不必要的时间浪费。
而OpenCV中的blur函数就是上面所提到的线性滤波中的一种。它和其他线性滤波算法的共性点自然在于它也是一个线性滤波器,满足叠加原理。
个性的地方在于这种线性滤波所用的卷积核的各个元素都是相等的,都是1,也就是它对该点邻域内的各个其他点“一视同仁”,“不分彼此”。所以这时候,分母的大小是m*n,分子呢?自然就是邻域内各点像素值求和。而这种“大锅饭”的坏处,便是消除噪声的同时也使得源图像的某些细节变得模糊不清。具体模糊的程度要看我们所选用的卷积核的大小(也就是m,n的大小