联合双边滤波

本文介绍了一种图像处理技术——联合双边滤波器的实现方法。通过使用高斯平滑和近似性权重,该滤波器能够在保持边缘细节的同时进行图像平滑。代码示例展示了如何使用Python和OpenCV库来实现这一算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#联合双边滤波
#图像高斯平滑,近似性权重由高斯平滑后确定
import numpy as np
from scipy import signal
import cv2,math
def getClosenessWeight(sigma_g,H,W):
    r,c = np.mgrid[0:H:1,0:W:1]
    r=r.astype(np.float64)
    c=c.astype(np.float64)
    r-=(H-1)/2
    c-=(W-1)/2
    closeWeight = np.exp(-0.5*(np.power(r,2)+np.power(c,2))/math.pow(sigma_g,2))
    return closeWeight
def jointBLF(I,H,W,sigma_g,sigma_d,borderType=cv2.BORDER_DEFAULT):
    closenessWeight = getClosenessWeight(sigma_g,H,W)
    #高斯平滑
    Ig = cv2.GaussianBlur(I,(W,H),sigma_g)
    cH = int((H-1)/2)
    cW = int((W-1)/2)
    Ip = cv2.copyMakeBorder(I,cH,cH,cW,cW,borderType)
    Igp = cv2.copyMakeBorder(Ig,cH,cH,cW,cW,borderType)
    rows,cols = I.shape
    i,j = 0,0
    jblf = np.zeros(I.shape,np.float64)
    for r in np.arange(cH,cH+rows,1):
        for c in np.arange(cW,cW+cols,1):
            pixel = Igp[r][c]
            rTop,rBottom = r-cH,r+cH
            cLeft,cRight = c-cW,c+cW
            region = Igp[rTop:rBottom+1,cLeft:cRight+1]
            similarityWeight = np.exp(-0.5*np.power(region-pixel,2.0)/math.pow(sigma_d,2.0))
            weight = closenessWeight*similarityWeight
            weight = weight/np.sum(weight)
            jblf[i][j] = np.sum(Ip[rTop:rBottom+1,cLeft:cRight+1]*weight)
            j+=1
        j = 0
        i+=1
    return jblf
if __name__ =='__main__':
    I = cv2.imread('E:/sy2/5/img3.jpg',cv2.IMREAD_GRAYSCALE)
    cv2.imshow('I',I)
    fI = I.astype(np.float64)
    jblf = jointBLF(fI,33,33,7,2)
    jblf = np.round(jblf)
    jblf = jblf.astype(np.uint8)
    cv2.imshow('jblf',jblf)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

### 双边滤波联合双边滤波的原理 双边滤波是一种非线性的平滑滤波器,它不仅可以减少噪声,还能很好地保留图像中的边缘信息。它的核心思想是在计算目标像素的新值时,综合考虑了两个因素:空间邻近度和强度相似度[^1]。具体而言,对于每一个像素 \( p \),其新值由周围像素加权平均得到: \[ I'(p) = \frac{1}{W_p} \sum_{q \in S} G_\text{spatial}(||p-q||) \cdot G_\text{range}(|I(p)-I(q)|) \cdot I(q) \] 其中: - \( W_p \) 是归一化因子; - \( G_\text{spatial} \) 表示空间高斯核,衡量像素之间的几何距离; - \( G_\text{range} \) 表示范围高斯核,衡量像素灰度值之间的差异。 这种双重权重机制使得双边滤波能够在去除噪声的同时保持边界清晰。 #### 联合双边滤波 联合双边滤波是对传统双边滤波的一个扩展版本,在计算权重的过程中额外引入了一幅引导图像的信息。这意味着除了原始输入图像外,还需要另一张辅助图像作为指导信号来决定如何分配权重[^2]。这种方法特别适合于某些特定应用场景下,比如颜色迁移或者纹理合成等任务中,能够提供更灵活的效果控制能力。 其实现方式基本延续自标准版双边过滤过程,只是将原本单纯依赖当前处理图片内部特征转变为结合外部参考数据共同作用形成最终输出结果的过程。 --- ### OpenCV 中实现双边滤波 OpenCV 提供了一个非常方便的方法 `cv::bilateralFilter` 来执行双边滤波操作: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat src = imread("image.jpg", IMREAD_COLOR); if (src.empty()) return -1; Mat dst; bilateralFilter(src, dst, 9, 75, 75); imshow("Original Image", src); imshow("Filtered Image", dst); waitKey(0); return 0; } ``` 在这里参数解释如下: - d: 过滤过程中使用的每个像素领域直径. - sigmaColor: 颜色空间的标准偏差. - sigmaSpace: 坐标空间内的标准偏差. --- ### MATLAB 实现双边滤波 MATLAB 同样支持快速构建此类功能模块,并且提供了内置函数简化开发流程: ```matlab % Load an image and convert it to grayscale img = rgb2gray(imread('peppers.png')); % Apply the built-in function for Bilateral Filtering filteredImg = imgaussfilt(img, 2, 'Sigma', [2 2]); figure; subplot(1,2,1),imshow(img),title('Original'); subplot(1,2,2),imshow(filteredImg),title('Bilaterally Filtered'); ``` 注意这里的 `imgaussfilt` 函数实际上是一个接近但不完全相同的替代品——即应用的是各向异性扩散模型而非严格意义上的双边滤波逻辑[^3]. 如果想要精确模拟真正的双边效果,则需手动编写相应代码片段完成定制需求。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值