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

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 条评论
登录 后参与评论

相关文章

来自专栏专知

【专知-Java Deeplearning4j深度学习教程04】使用CNN进行文本分类:图文+代码

【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视...

3K7
来自专栏IT派

经典!构建你的第一个神经网络识别数字

在Keras环境下构建多层感知器模型,对数字图像进行精确识别。模型不消耗大量计算资源,使用了cpu版本的keras,以Tensorflow 作为backende...

3685
来自专栏深度学习自然语言处理

神经网络基础模型--Logistic Regression的理论和实践

1 概述 Logistic Regression 即 逻辑回归,属于监督学习,输入x(特征数据),输出为0或1(显然是二分类)。为什么要用逻辑回归讲神经...

35915
来自专栏深度学习自然语言处理

如何直观地解释 back propagation 算法?

BackPropagation算法是多层神经网络的训练中举足轻重的算法。 简单的理解,它的确就是复合函数的链式法则,但其在实际运算中的意义比链式法则要大的多。 ...

1572
来自专栏机器学习、深度学习

卫星图像分割--Effective Use of Dilated Convolutions for Segmenting Small Object Instances

Effective Use of Dilated Convolutions for Segmenting Small Object Instances in R...

2555
来自专栏Petrichor的专栏

图像处理: 超像素(superpixels)分割 SLIC算法

超像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利...

1.8K3
来自专栏hadoop学习笔记

Python图像处理:图像腐蚀与图像膨胀

图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮...

1952
来自专栏ATYUN订阅号

深度实践:如何用神经网络给黑白照片着色

现如今,将图片彩色化是通常用Photoshop处理的。一幅作品有时候需要用一个月的时间来着色。可能单单一张脸就需要20层的粉色、绿色和蓝色阴影才能让它看起来恰到...

3097
来自专栏Coding迪斯尼

使用视觉化方法揭露卷积网络是如何从图片中抽取规律信息的

我们在前几节介绍过卷积网络的运算原理,以及通过代码实践,体验到了卷积网络对图片信息抽取的有效性。现在一个问题在于,我们知道卷积网络的运算过程,但不知道为什么卷积...

993
来自专栏数据科学学习手札

(数据科学学习手札09)系统聚类算法Python与R的比较

上一篇笔者以自己编写代码的方式实现了重心法下的系统聚类(又称层次聚类)算法,通过与Scipy和R中各自自带的系统聚类方法进行比较,显然这些权威的快捷方法更为高效...

3798

扫码关注云+社区

领取腾讯云代金券