bilateralFilter(双边滤波操作)

2019-08-05  本文已影响0人  itfitness

概念

双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。

效果图对比

●源图像



●处理后图像


函数讲解

●函数原型
○c++

void bilateralFilter( InputArray src, OutputArray dst, int d,
                                   double sigmaColor, double sigmaSpace,
                                   int borderType = BORDER_DEFAULT );

○Android

void bilateralFilter(Mat src, Mat dst, int d, double sigmaColor, double sigmaSpace, int borderType)

●参数解释
○src:源图像Mat对象,需要为8位或者浮点型单通道、三通道的图像
○dst:目标图像Mat对象,不能直接用src来存储处理后的图像
○d:表示在过滤过程中每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来,在使用过程中我发现有点像模糊力度的意思。
○sigmaColor:颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。在使用过程中我发现有点像模糊范围的意思,范围越大看着越模糊
○sigmaSpace:坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。使用过程中我发现这个值越大,图像的过渡效果越好。
○borderType:使用默认即可,即不用填。

函数使用

●c++中

#include<opencv2/opencv.hpp>
using namespace cv;
int main() {
    Mat src = imread("C:/Users/Administrator/Desktop/sb.png");//引入源图像
    if (src.empty()) {
        return -1;
    }
    imshow("src", src);//展示源图像
    Mat dst;
    bilateralFilter(src,dst,30,50,20);//双边滤波处理
    imshow("dst", dst);//展示目标图像
    waitKey(0);
    return 0;
}

●Android中

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_beauty);//获取源图像Bitmap
Mat src = new Mat();
Mat dst = new Mat();
Utils.bitmapToMat(bitmap,src);//将Bitmap转换为Mat对象
Imgproc.cvtColor(src,src,Imgproc.COLOR_RGBA2RGB);//将图像转换为三通道(CV_8UC3),因为双边滤波的操作不支持原图像的4通道(CV_8UC4)
Imgproc.bilateralFilter(src,dst,30,50,20);//双边滤波处理
Utils.matToBitmap(dst,bitmap);//将Mat对象转换为Bitmap对象
imageView.setImageBitmap(bitmap);
上一篇下一篇

猜你喜欢

热点阅读