问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

图像处理:设计动态高斯滤波

创作时间:
作者:
@小白创作中心

图像处理:设计动态高斯滤波

引用
CSDN
1.
https://blog.csdn.net/JNingWei/article/details/79137301

Idea

OpenCV中有一个实现高斯滤波的接口,如下:

cv2.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)

在项目过程中,发现如果根据像素点相对整张图片的位置设计不同的滤波核大小(即参数ksize),就可以灵活地对整张图片实现动态高斯滤波。具体滤波核大小计算公式如下:

size = int(k1*x + k2*y + b) * 2 + 1

Note :注意保证输出结果为整型奇数,因为参数ksize只接受整型奇数输入。

由于图片大小是600×424×3,所以k1,k2,b的取值如下:

Demo

原图像:

水平动态高斯滤波:

垂直动态高斯滤波:

Code

以下代码中,关于“对角动态高斯滤波(diagonal gaussian)”的代码段有问题,所以被注释掉了。因为不能对单元素单独进行高斯滤波,所以会报错。具体该怎么解决,我也一时没想到。

# coding=utf-8
import numpy as np
import cv2

def kernel_size(x, y, type):
    if type == "vertical":
        k1, k2, b = 0, 0.012, 0
    elif type == "horizontal":
        k1, k2, b = 0.009, 0, 0
    elif type == "diagonal":
        k1, k2, b = 0.0053, 0.0053, 0
    else:
        k1, k2, b = 0, 0, 11
    size = int(k1*x + k2*y + b) * 2 + 1
    return size

def range_limit(img):
    img *= (img>0)
    img = img * (img<=255) + 255 * (img>255)
    img = img.astype(np.uint8)
    return img

def dynamic_gaussian(img):
    h, w, c = np.shape(img)
    sigma = 2
    # gs_v: vertical gaussian, 垂直高斯
    # gs_h: horizontal gaussian, 水平高斯
    # gs_d: diagonal gaussian, 对角高斯
    gs_v, gs_h, gs_d = img.copy(), img.copy(), img.copy()
    for i in range(h):
        k_size = kernel_size(w, i, "vertical")
        gs_v[i, :, :] = cv2.GaussianBlur(gs_v[i, :, :], (k_size, k_size), sigma)
        print(i, k_size)
    for j in range(w):
        k_size = kernel_size(j, h, "horizontal")
        gs_h[:, j, :] = cv2.GaussianBlur(gs_h[:, j, :], (k_size, k_size), sigma)
        print(j, k_size)
    # # 报错:
    # for i in range(h):
    #     for j in range(w):
    #         k_size = kernel_size(i, j, "diagonal")
    #         gs_d[i, j, :] = cv2.GaussianBlur(gs_d[i, j, :], (k_size, k_size), sigma)
    #         print(i, j, k_size)
    return gs_v, gs_h, gs_d

def main():
    img_path = "./girl.jpg"
    img = cv2.imread(img_path)
    gs_v, gs_h, gs_d = dynamic_gaussian(img)
    cv2.imwrite("./gs_v.jpg", gs_v)
    cv2.imwrite("./gs_h.jpg", gs_h)
    cv2.imwrite("./gs_d.jpg", gs_d)

if __name__ == "__main__":
    main()  

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号