专栏首页Petrichor的专栏图像处理: 设计 动态高斯滤波

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

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 取值如下:

k1,k2,b=⎧⎩⎨⎪⎪0,0.012,00.009,0,00.0053,0.0053,0垂直高斯;水平高斯;对角高斯.

k1, k2, b=\left\{\begin{array}{ll}0, 0.012, 0 &\mbox{垂直高斯;}\\0.009, 0, 0 &\mbox{水平高斯;}\\0.0053, 0.0053, 0 &\mbox{对角高斯.}\end{array}\right.

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()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python: 在图片上 打印中文

    JNingWei
  • leetcode: 37. Sudoku Solver

    …and its solution numbers marked in red.

    JNingWei
  • python: str.format (字符串 格式化)

    JNingWei
  • Spring Cloud Config服务端配置细节(二)之加密解密

    在微服务架构中,由于独立的服务个数众多,加上前期测试工作量大,一些原本由运维人员维护的敏感信息会被我们直接写在微服务中,以提高开发效率,但是这种明文存储方式显然...

    江南一点雨
  • SpringMVC接收数组

    后台写@RequestParam("img_array[]") String[] img_array

    試毅-思伟
  • CSS中字体相关的小技巧

    你是否早已厌倦了司空见惯的Helvetica字体?想让你的网页别有一番趣味?或是想避免和同事讨论这些琐事?那么我想你需要看看下面这些代码。在项目中添加这样一小块...

    疯狂的技术宅
  • 机器学习系列(六)Adaboost

    机器学习系列(六)Adaboost 前面我们已经介绍了几种不同的分类器,每种分类器都各有优缺点,我们可以借助集成学习的方法将不同的分类器组合起来,将多个弱可学习...

    Minerva
  • Zeppelin整合Flink采坑实录

    前两天转了章大的zeppelin系列教程(以下简称“教程”),我也好好的研究学习了一波。

    麒思妙想
  • 如何校验 Debian 软件包的 MD5

    你有没有想过为什么安装在你系统上的某个二进制文件或软件包没有按预期的那样来运行,或者说没有按正常的方式来运行,也许它根本就无法启动。

    Debian社区
  • pandas:数据离散化与离散化数据的后期处理(one-hot)

      对于某些机器学习算法来说,像决策树、随机森林、朴素贝叶斯。他们的数据集大多数都是针对的离散型数据。因此做出有效的数据离散化,对于降低计算复杂度和提高算法准确...

    朱小五

扫码关注云+社区

领取腾讯云代金券