第五节:图像平滑2

一:联合双边滤波

    

        代码实现:

import numpy as np
import cv2
import math


def getClosenessWeight(sigma_g, H, W):
    # 计算空间距离权重模板
    r, c = np.mgrid[0:H:1, 0:W:1]  # 构造三维表
    r -= int((H-1) / 2)
    c -= int((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)

    # 对I进行高斯平滑
    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 range(cH, cH+rows, 1):
        for c in range(cW, cW+cols, 1):
            # 当前位置的值
            pixel = Igp[r][c]

            # 当前位置的邻域
            rTop, rBottom = r-cH, r+cH
            cLeft, cRight = c-cW, c+cW

            # 从 Igp 中截取该邻域,用于构建相似性权重模板
            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('p2.jpg', cv2.IMREAD_GRAYSCALE)
    # 将8位图转换为浮点型
    fI = I.astype(np.float64)

    # 联合双边滤波,返回值的数据类型为浮点型
    jblf = jointBLF(fI, 33, 33, 7, 2)
    jblf = np.round(jblf)
    jblf = jblf.astype(np.uint8)

    cv2.imshow('origin', I)
    cv2.imshow('jblf', jblf)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

输出结果:

  

图像平滑就这些算法  。。随后学到新方法再继续更新   

                                                                              下一节我们学习阈值分割。。。。。