Python+OpenCV 实现简单的高斯滤波(推荐)
作者:林林zonzon 发布时间:2021-07-18 20:31:26
标签:Python,OpenCV,高斯滤波
基本原理讲解:高斯模糊的算法
高斯核函数的编写:构建权重矩阵,采用高斯二维分布函数的形式进行处理。需要注意的是,这里我没有特判当sigma = 0的时候的情况。
即是实现:
1)权重矩阵的构建
根据公式:
计算矩阵内部结构,其中因为要进行归一化处理,e前方的系数会被约去,因此代码中不体现。
2)矩阵元素归一化处理
计算矩阵内部元素总和sum,最后做矩阵除法得到归一化处理后的权重矩阵。
# 高斯核生成函数 kernel_size:滤波核大小 sigma:高斯核函数的局部影响范围
def gauss(kernel_size, sigma):
#定型0填充
kernel = np.zeros((kernel_size, kernel_size))
#确定正态分布中间值
center = kernel_size // 2
# s:方差 sum:记录总和
s = sigma ** 2
sum = 0
for i in range(kernel_size):
for j in range(kernel_size):
#由于最后要进行归一化处理,此处根号下2Π计算可以省略
x, y = i - center, j - center
kernel[i, j] = np.exp(-(x ** 2 + y ** 2) / (2 * s))
sum += kernel[i, j]
#归一化处理后输出
kernel = kernel / sum
return kernel
滤波函数的编写:将图片中的每个像素点(边缘除外)及其周围像素乘以权重矩阵,实现高斯滤波
需要注意的是此函数仅能处理彩色图片,因为只有彩色图片拥有img.shape[2]元素,灰度图片没有img.shape[2]元素不能用这个方法处理。
# 高斯滤波实现,img:输入图像 kermel:输入高斯核函数
def myfilter(img,kernel):
# 读取img行数核列数
h = img.shape[0]
w = img.shape[1]
# 直接拷贝父对象
img1 = copy.copy(img)
# 去掉边缘
for i in range(1,h-1):
for j in range(1,w-1):
# 三通道处理
for c in range(0,2):
sum = 0
# 加权
for k in range(-1,2):
for l in range(-1,2):
sum += img[i+k,j+l,c]*kernel[k+1,l+1]
img1[i,j,c] = sum
return img1
同时在处理高斯滤波的时候,函数采取的是针对3*3的kernel_size进行编写的,要更改kernel_size的大小,需要更改此处的range范围。
下面是灰度图像的处理方式:
def myfilter2(img,kernel):
# 读取img行数核列数
h = img.shape[0]
w = img.shape[1]
# 直接拷贝父对象
img1 = copy.copy(img)
# 去掉边缘
for i in range(1,h-1):
for j in range(1,w-1):
sum = 0
for k in range(-1,2):
for l in range(-1,2):
sum += img[i+k,j+l]*kernel[k+1,l+1]
img1[i,j] = sum
return img1
最后整个运行代码:
import copy
import cv2
import numpy as np
#图像读取
img_y = cv2.imread('p2.jpg')
# 选择高斯生成函数3*3,其中sigama = 3
kernel = gauss(3,3)
# 打印这个生成函数
print(kernel)
# 高斯滤波处理
img1 = myfilter(img_y, kernel)
cv2.imshow('P1_yuantu',img_y)
cv2.imshow('P1_gaussian', img1)
cv2.waitKey(0)
输入输出图像结果展示:
原图与高斯滤波后
需要注意的是采取的方法很原始,如果输入的图像过大,运行时间会很久。
这方面东西挺有意思的,只是初略的学习,写些基础的东西,应该还有错漏的地方,希望有大佬们多多指点。
来源:https://blog.csdn.net/zujiasheng/article/details/120364435


猜你喜欢
- 先上个效果图: Sample6_1.php 中创建Form: //显示上传状态和图片 <div id="showi
- 前言本文提供将视频按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考文章:windows ffmp
- 文字向下滾動,逐渐隐藏效果~ 挺好的 <!DOCTYPE html PUBLIC "-//W3C//DTD XHT
- pytorch查看模型model参数parameters示例1:pytorch自带的faster r-cnn模型import torchim
- 一、插件是什么?插件是遵循一定规范的应用程序接口编写出来的程序,而chrome插件则是运行在chrome浏览器上的小程序,能帮我们解决一下工
- K-Means聚类算法演示及可视化展示#导入包from sklearn.cluster import KMeansX = [[0.0888,
- app01/models.py:from django.db import modelsclass UserInfo(models.Mode
- 1.参数propsprops是一个对象,包含父组件传递给子组件的所有数据。在子组件中使用props进行接收。包含配置声明并传入的所有的属性的
- 配置类config_file:from configparser import ConfigParserclass config_file:
- 前言字符串作为一种重要的Python基本数据类型,在数据处理中发挥着不可或缺的作用,如果对它的方法能够灵活使用,能够达到事半功倍的效果。下面
- 高级特性切片操作:对list,tuple元素进行截取操作,非常简便。L[0:3],L[:3] 截取前3个元素。L[1:3] 从1开始截取2个
- 具体代码如下所示:#字符串反转def reverse (s): rt = '' for i in r
- 本文主要研究的是flask如何截获所有访问,以及before_request、after_request修饰器的相关内容,具体如下。在学习着
- 前言??在vue项目中我们常常需要用到computed和watch,那么我们究竟在什么场景下使用computed和watch呢?他们之间又有
- 又发现一个IE不标准的地方,unshift方法会返回新数组的长度,但IE6与IE7则返回undefined。var a = [3,2,1,4
- 本文介绍了一些JavaScript常用到得表单验证函数,方便大家使用。 判断是否为整数,是则返回true,否则返回falsefun
- MaxDB和MySQL是独立的数据库管理服务器。系统间的协同性是可能的,通过相应的方式,系统能够彼此交换数据。要想在MaxDB和MySQL之
- 菜鸟版代码如下: 理解这段代码就基本上掌握了 function f_s() { var obj = document.getElementB
- 上次介绍了如何通过钉钉进行群通知,有同学反馈自己更习惯使用企业微信或公司使用了企业微信,希望也能出个基于Python的企业微信的群通知教程,
- 本文实例讲述了Python二叉树的遍历操作。分享给大家供大家参考,具体如下:# coding:utf-8"""