7. 高斯模糊

均值模糊的扩展,权重均值模糊,效果比均值模糊好,应用场景毛玻璃

虽然kernel是3*3的核,但是会拆分成x,y进行2次,速度反而快了  (这是一种加速的手段)
如果是二维的话,有9次乘法,1次除法
如果是一维的话,就是3次乘法1次除法,在做3次乘法1次除法,一共是6次乘法和2次除法

给图片增加噪声


def clamp(pv):
    if pv > 255:
        return 255
    elif pv < 0:
        return 0
    else:
        return pv

def gaussian_noise(img):
    h,w,ch = img.shape
    for row in range(h):
        for col in range(w):
            s = np.random.normal(0, 20, 3)
            b = img[row, col, 0]
            g = img[row, col, 1]
            r = img[row, col, 2]
            img[row, col, 0] = clamp(b + s[0])
            img[row, col, 1] = clamp(g + s[1])
            img[row, col, 2] = clamp(r + s[2])
    cv.imshow("noise img", img)

高斯模糊API

dst = GaussianBlur(src, (0,0), 15)
毛玻璃效果    会保留特征
dst = GaussianBlur(src, (5,5), 0)

 

<think>我们正在讨论高斯模糊算法。根据用户的问题,他/她想了解高斯模糊算法中的变量及其作用。虽然用户提供的引用[1]和[2]都是关于高斯模糊的,但用户特别指出这些引用仅供参考,并强调要参考上一次的问题和回答。然而,在对话历史中,上一次的问题是关于PID算法中的超调,与当前问题无关。因此,我们将忽略对话历史,专注于当前问题。 高斯模糊是一种图像处理技术,用于对图像进行平滑(模糊)处理。它使用高斯函数生成一个卷积核(也称为高斯核),然后用该核与图像进行卷积操作。高斯模糊的主要变量包括: 1. **高斯函数**高斯函数是定义在二维空间上的连续函数,其形式为: $$ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} $$ 其中: - $\sigma$(sigma):高斯分布的标准差,控制模糊的程度。$\sigma$越大,图像越模糊。 - $x, y$:表示距离中心点的水平和垂直距离。 2. **高斯**: 在实际应用中,我们需要将连续的高斯函数离散化,得到一个固定大小的卷积核。高斯核是一个矩阵,矩阵中的每个元素由高斯函数计算得到。高斯核的大小通常是奇数,这样有中心点。假设核的大小为$(2k+1)\times(2k+1)$,则核中的每个元素为: $$ G[i][j] = \frac{1}{2\pi\sigma^2} e^{-\frac{(i-k-1)^2+(j-k-1)^2}{2\sigma^2}} \quad \text{for } i,j=0,1,...,2k $$ 然后,为了确保卷积后图像亮度不变,需要对核进行归一化,即让核中所有元素之和为1。 3. **卷积操作**: 将生成的高斯核应用于图像的每个像素(边缘像素需要特殊处理),通过卷积计算新的像素值。对于图像中的每个像素$(x,y)$,其卷积计算为: $$ I'(x,y) = \sum_{i=0}^{n-1}\sum_{j=0}^{n-1} I(x+i-k, y+j-k) \cdot G[i][j] $$ 其中: - $I$:原始图像。 - $I'$:模糊后的图像。 - $n$:高斯核的大小(例如3,5,7等)。 - $k$:通常取为$(n-1)/2$,即中心点索引。 4. **变量总结**: - **$\sigma$(标准差)**:控制模糊程度。$\sigma$越大,高斯核的权重分布越分散,模糊效果越明显;$\sigma$越小,权重越集中在中心,模糊效果越弱。 - **核大小(n)**高斯核的尺寸。核尺寸越大,模糊效果越强,但计算量也越大。通常,核大小与$\sigma$有关,一般取$n$为大于等于$6\sigma$的最小奇数(实际中常用$3\times3$, $5\times5$等,但需要根据$\sigma$调整)。 5. **其他注意事项**: - **归一化**:在生成高斯核后,必须进行归一化(即核中所有元素之和为1),以避免改变图像的整体亮度。 - **可分离性**高斯函数具有可分离性,即二维高斯核可以分解为两个一维高斯核(一个水平方向,一个垂直方向)的乘积。这可以显著减少计算量。一维高斯函数为: $$ G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}} $$ 然后,先对图像的行进行一维卷积,再对列进行一维卷积,得到的结果与二维卷积相同,但计算量从$O(n^2)$降为$O(2n)$。 6. **实际应用中的变量选择**: - 当$\sigma$固定时,可以选择一个足够大的核尺寸(通常取$n=2\lceil3\sigma\rceil+1$),以保证覆盖高斯函数的主要部分(99.7%的值在$3\sigma$以内)。 - 例如,当$\sigma=1$时,核尺寸可取$7\times7$(因为$3\sigma=3$,所以$n=2*3+1=7$)。 因此,高斯模糊算法中的关键变量是标准差$\sigma$和核大小$n$,它们共同决定了模糊的效果和计算效率。 引用说明:以上内容参考了用户提供的引用[1]和[2]中关于高斯模糊原理的介绍。 现在,我们根据上述内容生成相关问题。</think>### 高斯模糊算法中的变量及其作用 高斯模糊是一种常用的图像平滑技术,通过高斯函数生成的卷积核实现模糊效果。以下是关键变量及其作用: #### 1. **标准差 $\sigma$** [^1] - **作用**:控制模糊程度的核心参数 - **数学定义**: $$ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} $$ - **影响规律**: - $\sigma$ 越大 → 权重分布越分散 → 模糊效果越强 - $\sigma$ 越小 → 权重越集中 → 模糊效果越弱 - **典型取值**:0.5~5.0(根据所需模糊强度调整) #### 2. **核尺寸 $n \times n$** [^1] - **作用**:定义卷积核的大小范围 - **计算关系**: $$ n = 2 \times \lceil 3\sigma \rceil + 1 $$ (覆盖99.7%的高斯分布区域) - **示例**: - $\sigma=1$ 时 → $n=7$(7×7核) - $\sigma=0.5$ 时 → $n=3$(3×3核) #### 3. **权重矩阵 $K$** [^1] - **作用**:存储各像素位置的模糊权重 - **计算步骤**: 1. 离散化高斯函数生成初始权重 2. 归一化处理:$ K_{\text{norm}}[i][j] = \frac{K[i][j]}{\sum K} $ 3. 确保所有权重之和为1(避免亮度偏移) #### 4. **卷积偏移量 $(dx, dy)$** [^2] - **作用**:定位卷积核与图像的对应位置 - **计算方式**: ```python for dx in range(-k, k+1): for dy in range(-k, k+1): # 计算当前像素的加权贡献 ``` 其中 $k = (n-1)//2$ 为核半径 #### 5. **归一化因 $Z$** - **作用**:保证能量守恒 - **计算式**: $$ Z = \sum_{i=-k}^{k} \sum_{j=-k}^{k} G(i,j) $$ - **重要性**:防止图像整体变亮/变暗 #### 变量关系示意图 ``` 输入图像 → [σ确定核尺寸] → [生成权重矩阵] → [卷积运算] → 输出模糊图像 ↑ ↑ (n×n) (归一化Z) ``` #### 实际应用建议 1. **实时渲染**:小核尺寸(3×3)结合多次迭代[^2] 2. **精细处理**:大σ配合大核尺寸(如σ=2.0, n=11×11) 3. **性能优化**:利用可分离卷积特性(先水平后垂直卷积) --- ### 高斯模糊卷积示例代码 ```python import numpy as np def gaussian_blur(image, sigma=1.0): # 计算核尺寸 n = 2 * int(3*sigma) + 1 # 核尺寸 k = n // 2 # 核半径 # 生成高斯核 kernel = np.zeros((n, n)) for i in range(-k, k+1): for j in range(-k, k+1): kernel[i+k, j+k] = np.exp(-(i**2+j**2)/(2*sigma**2)) kernel /= kernel.sum() # 归一化 # 执行卷积 blurred = np.zeros_like(image) for x in range(k, image.shape[0]-k): for y in range(k, image.shape[1]-k): patch = image[x-k:x+k+1, y-k:y+k+1] blurred[x, y] = np.sum(patch * kernel) return blurred ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值