8位图像的双边滤波器实现

static void bilateralFilter_8u( const Mat& src, Mat& dst, int d,
    double sigma_color, double sigma_space,int borderType )
{
    // 获取原始图像信息
    int cn = src.channels();
    int i, j, maxk, radius;
    Size size = src.size();
    CV_Assert( (src.type() == CV_8UC1 || src.type() == CV_8UC3) &&
              src.type() == dst.type() && src.size() == dst.size() &&
              src.data != dst.data );
    // 高斯参数设置
    if( sigma_color <= 0 )
        sigma_color = 1;
    if( sigma_space <= 0 )
        sigma_space = 1;
    // 颜色空间与距离空间初始化
    double gauss_color_coeff = -0.5/(sigma_color*sigma_color);
    double gauss_space_coeff = -0.5/(sigma_space*sigma_space);
    // 内核边界设置
    if( d <= 0 )
        radius = cvRound(sigma_space*1.5);
    else
        radius = d/2;
    radius = MAX(radius, 1);
    d = radius*2 + 1;
    // 图像边界处理
    Mat temp;
    copyMakeBorder( src, temp, radius, radius, radius, radius, borderType );
    // 距离空间相似度计算
    vector<float> _color_weight(cn*256);
    vector<float> _space_weight(d*d);
    vector<int> _space_ofs(d*d);
    float* color_weight = &_color_weight[0];
    float* space_weight = &_space_weight[0];
    int* space_ofs = &_space_ofs[0];
    // 初始化颜色相似度权值 
    for( i = 0; i < 256*cn; i++ )
        color_weight[i] = (float)std::exp(i*i*gauss_color_coeff);
    // 计算距离相似度权值
    for( i = -radius, maxk = 0; i <= radius; i++ )
    {
        j = -radius;

        for( ;j <= radius; j++ )
        {
            // 计算距离范数
            double r = std::sqrt((double)i*i + (double)j*j);
            if( r > radius )
                continue;
            // 应用高斯变换计算出相似度
            space_weight[maxk] = (float)std::exp(r*r*gauss_space_coeff);
            space_ofs[maxk++] = (int)(i*temp.step + j*cn);
        }
    }
    // 得到双边滤波结果
    BilateralFilter_8u_Invoker body(dst, temp, radius, maxk, 
        space_ofs, space_weight, color_weight);
    parallel_for_(Range(0, size.height), body, dst.total()/(double)(1<<16));
}



转载:http://blog.csdn.net/zhuwei1988

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双边滤波是一种非线性滤波,它在保持边缘信息的同时平滑图像。在Python中,可以使用OpenCV库来实现双边滤波。 首先,需要安装OpenCV库。可以使用以下命令来安装: ``` pip install opencv-python ``` 接下来,导入所需的库: ```python import cv2 import numpy as np ``` 定义一个函数来实现双边滤波: ```python def bilateral_filter(image, d, sigma_color, sigma_space): # 使用OpenCV内置函数进行双边滤波 filtered_image = cv2.bilateralFilter(image, d, sigma_color, sigma_space) return filtered_image ``` 在这个函数中,`image`参数是要进行滤波的图像,`d`参数是滤波过程中使用的像素邻域直径,`sigma_color`是颜色空间方差,`sigma_space`是坐标空间方差。 最后,可以使用以下代码来读取图像并应用双边滤波: ```python # 读取图像 image = cv2.imread("image.jpg") # 转换图像为灰度图 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 传递图像和滤波参数给双边滤波函数 filtered_image = bilateral_filter(gray_image, 15, 75, 75) # 显示滤波前后的图像 cv2.imshow("Original Image", gray_image) cv2.imshow("Filtered Image", filtered_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,图像被读取为彩色图像,并转换为灰度图像,然后由函数`bilateral_filter`进行双边滤波处理。最后,使用`cv2.imshow`函数显示原始图像和滤波后的图像。 以上就是一个基本的双边滤波代码实现的Python示例。根据实际需求,可以调整滤波参数,如邻域直径和方差等,以获得更好的滤波效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值