OpenCV轻松入门(八)——图片卷积

news2024/11/24 13:53:30

对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积

卷积需要4个嵌套循环,所以它并不快,除非我们使用很小的卷积核。这里一般使用3x3或者5x5

图像滤波

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。

线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二维的滤波器矩阵(卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。

对于滤波器/卷积核,也有一定的规则要求:

  1. 滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2
  2. 滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然了,这不是硬性要求了。
  3. 如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。
  4. 对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。

均值滤波

将卷积核内的所有灰度值加起来,然后计算出平均值,用这个平均值填充卷积核正中间的值,这样做可以降低图像的噪声,同时也会导致图像变得模糊。

G = 1/9\begin{bmatrix} 1 & 1& 1\\ 1& 1 &1 \\ 1& 1 & 1 \end{bmatrix}

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 写代码时用的jupyter,cv2.imshow总是卡死,所以用的plt方便显示图像
def imgshow(img):
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    plt.show()

dog_img = cv2.imread('/Users/guojun/Desktop/444.png',cv2.IMREAD_COLOR)
# 均值滤波: cv2.blur(img,knelsize) img-图片,卷积核大小
dst = cv2.blur(dog_img,(10,10))
imgshow(dst)

高斯模糊

采用均值滤波降噪会导致图像模糊的非常厉害,有没有一种方式既能保留像素点真实值又能降低图片噪声呢?那就是加权平均的方式. 离中心点越近权值越高,越远权值越低.

但是权重的大小设置非常麻烦,那么有没有一种方式能够自动生成呢? 这个就是需要用到高斯函数

高斯函数呈现出的特征就是中间高,两边低的钟形

高斯模糊通常被用来减少图像噪声以及降低细节层次。

 G = 1/9\begin{bmatrix} 1 & 2& 1\\ 2& 4 & 2 \\ 1& 2 & 1 \end{bmatrix}

 

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 写代码时用的jupyter,cv2.imshow总是卡死,所以用的plt方便显示图像
def imgshow(img):
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    plt.show()

dog_img = cv2.imread('/Users/guojun/Desktop/444.png',cv2.IMREAD_COLOR)
# 高斯模糊   参数1:图像  参数2:卷积核大小, 参数3:标准差越大,去除高斯噪声能力越强,图像越模糊
dog_gaussianblur = cv2.GaussianBlur(dog_img,(15,15),50)
imgshow(dog_gaussianblur)

中值滤波

对邻近的像素点进行灰度排序,然后取中间值,它能有效去除图像中的椒盐噪声

操作原理:

  1. 卷积域内的像素值从小到大排序
  2. 取中间值作为卷积输出

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 写代码时用的jupyter,cv2.imshow总是卡死,所以用的plt方便显示图像
def imgshow(img):
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    plt.show()
    
img = cv2.imread('/Users/guojun/Desktop/444.png',cv2.IMREAD_COLOR)
# 中值滤波   参数1:图像  参数2:卷积核大小,卷积核必须为单数
dst = cv2.medianBlur(img,11)
imgshow(dst)

Sobel算子

Sobel算子是像素图像边缘检测中最重要的算子之一,在机器学习、数字媒体、计算机视觉等信息科技领域起着举足轻重的作用。在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。在图像的任何一点使用此算子,将会产生该点对应的梯度矢量。

使用方式:

  1. 原图---> x 方向sobel
  2. 原图----> y 方向sobel
  3. xy合在一起

水平梯度:

Gx = \begin{bmatrix} -1 & 0& 1\\ -2& 0 & 2 \\ -1& 0 & 1 \end{bmatrix} 

垂直梯度:

Gy = \begin{bmatrix} -1 & -2& -1\\ 0& 0 & 0 \\ 1& 2 & 1 \end{bmatrix}

合成:

G=\sqrt{G{x}^{2}+G{y}^{2}}

备注:为了提高计算机效率我们通常会使用: G = |Gx|+|Gy|

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 写代码时用的jupyter,cv2.imshow总是卡死,所以用的plt方便显示图像
def imgshow(img):
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    plt.show()
    

# Sobel算子   
img = cv2.imread('/Users/guojun/Desktop/mri.jpg',cv2.IMREAD_GRAYSCALE)

# Sobel算子:x方向求导
# 参数1:图像,参数2:图像的深度,-1表示和原图相同,参数3:x方向求导的阶数 参数4:y方向求导的阶数
x_sobel = cv2.Sobel(img,cv2.cv2.CV_32F,1,0)
# 将图像转为8位int
x_sobel = cv2.convertScaleAbs(x_sobel)
# imgshow(x_sobel)

# Sobel算子:y方向求导
y_sobel = cv2.Sobel(img,cv2.cv2.CV_32F,0,1)
# 将图像转为8位int
y_sobel = cv2.convertScaleAbs(y_sobel)
# imgshow(y_sobel)

# 将x,y方向的内容叠加起来
dst = x_sobel + y_sobel
imgshow(dst)

Scharr算子

由于使用Sobel算子计算的时候有一些偏差, 所以opencv提供了sobel的升级版Scharr函数,计算比sobel更加精细.

 

代码实现

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 写代码时用的jupyter,cv2.imshow总是卡死,所以用的plt方便显示图像
def imgshow(img):
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    plt.show()
    

# Scharr算子   
img = cv2.imread('/Users/guojun/Desktop/mri.jpg',cv2.IMREAD_GRAYSCALE)

# Scharr算子:x方向求导
# 参数1:图像,参数2:图像的深度,-1表示和原图相同,参数3:x方向求导的阶数 参数4:y方向求导的阶数
x_Scharr = cv2.Scharr(img,cv2.cv2.CV_32F,1,0)
# 将图像转为8位int
x_Scharr = cv2.convertScaleAbs(x_sobel)
# imgshow(x_sobel)

# Scharr算子:y方向求导
y_Scharr = cv2.Sobel(img,cv2.cv2.CV_16S,0,1)
# 将图像转为8位int
y_Scharr = cv2.convertScaleAbs(y_sobel)
# imgshow(y_sobel)

# 将x,y方向的内容叠加起来
dst = x_Scharr + y_Scharr
imgshow(dst)

拉普拉斯算子 

通过拉普拉斯变换后增强了图像中灰度突变处的对比度,使图像中小的细节部分得到增强,使图像的细节比原始图像更加清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Map与Set的模拟实现封装

目录 一. 底层原理 二. 红黑树节点的定义 三. 仿函数封装 四. 基本函数的封装 五. 迭代器的封装 5.1 迭代器的基本定义 5.2 *与->操作 5.3 迭代器的操作 5.3.1 右子树不为空 5.3.2 右子树为空 5.4 迭代器的--操作 5.4.1 当前节点的父节点…

CentOS 7开机启动过程,引导和服务,密码的修改

开机启动过程: 引导过程:1.开机自检(BIOS)->2.MBR引导->GRUB菜单->加载内核kernel->systemd进程初始化 程序:执行特定任务的一串代码,静态,存在硬盘中。 进程:运行中的程序叫进程&#xff0…

第十一章数据仓库和商务智能10分

【数据仓库-后端,商务智能-前端】 基本算法:关联关系(牵手-谈恋爱),集群关系(杭州人爱吃酸甜口),决策树,线性回归,贝叶斯,神经网络,时…

【Linux】磁盘扩容到根目录逻辑卷(LVM)

目录 一、物理卷和逻辑卷 1.物理卷和逻辑卷的区别 2.在Linux系统中查看所有物理卷的信息 3.在Linux系统中查看所有逻辑卷的信息 二、文件系统 三、实操-对root(/)目录进行扩容 1.使用lsblk命令查看新加入的磁盘信息 2.fdisk -l命令查看系统中磁盘…

景区导览系统平台|智能导览|数字人导游|VR游园

随着人工智能、元宇宙等技术的飞速发展,文旅行业正迎来一场前所未有的变革。道可云文旅元宇宙平台以其独特的智慧景区导览系统、元宇宙空间以及数字人导游等创新应用,为景区和游客带来了全新的旅游体验,也标志着文旅行业正式步入了元宇宙时代…

含多种需求响应及电动汽车的微网/虚拟电厂日前优化调度

1 主要内容 程序主要建立一个微网/虚拟电厂的日前优化调度模型,以燃气轮机运行成本、购售电费用、电动汽车电池损耗成本以及需求响应费用之和为目标,在日前经济调度模型中,加入了电动汽车模型,考虑了电动汽车出行规律以及充放电规…

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

文章目录 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具1. 介绍2. 下载3. 静音模式、平衡模式、增强模式配置4. 配置电源方案与模式切换绑定5. 启动Ghelper控制面板6. 目前支持的设备型号 华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理…

环境搭建创建项目_使用DevEco开发工具进行开发_创建项目_认识项目结构---HarmonyOS4.0+鸿蒙NEXT工作笔记001

首先去下载DevEco Studio然后再去安装就可以了 安装下一步下一步非常简单 首先去安装nodejs,可以看到,有两个安装方法,左边是自己安装的制定文件夹就可以了,然后 右边是使用鸿蒙自带的,我们选择第二个 然后我们看这个ohpm其实就跟npm是一个意思,用来管理鸿蒙的包的. 这里我们…

JavaEE:JVM

基本介绍 JVM:Java虚拟机,用于解释执行Java字节码 jdk:Java开发工具包 jre:Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言,而java不想重新编译,希望能直接执行。Java先通过javac把.java…

【机器学习】贝叶斯算法在机器学习中的应用与实例分析

贝叶斯算法在机器学习中的应用与实例分析 一、贝叶斯算法原理及重要性二、朴素贝叶斯分类器的实现三、贝叶斯网络在自然语言处理中的应用四、总结与展望 在人工智能的浪潮中,机器学习以其独特的魅力引领着科技领域的创新。其中,贝叶斯算法以其概率推理的…

用于密集视觉冲击的紧凑三维高斯散射Compact 3D Gaussian Splatting For Dense Visual SLAM

Compact 3D Gaussian Splatting For Dense Visual SLAM 用于密集视觉冲击的紧凑三维高斯散射 Tianchen Deng 邓天辰11Yaohui Chen 陈耀辉11Leyan Zhang 张乐妍11Jianfei Yang 杨健飞22Shenghai Yuan 圣海元22Danwei Wang 王丹伟22Weidong Chen 陈卫东11 Abstract 摘要 …

通过腾讯云搭建跨境电商demo的详细操作过程(建站系统 保姆级指导,巨详细)

引言: 有许多做跨境电商的朋友,或者为跨境电商服务的小企业,都会面临搭建电商平台V1.0的问题 因此,花了点时间,找了一个开源的项目,让大家可以跑起来,一方面了解平台都有哪些模块,另…

Unity 左右折叠显示与隐藏UI的简单实现

要实现一个简单的UI左右折叠显示与隐藏,可以结合遮罩,通过代码控制UI区块的宽度和位移来实现。 具体可以按以下步骤实现: 1、新建一个Image组件,并添加精灵,调整大小后,复制一份作为该UI的父物体&#xf…

1、MYSQL系列-深入理解Mysql索引底层数据结构与算法

索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构 二叉树红黑树Hash表BTree B-Tree B-Tree 叶节点具有相同的深度,叶节点的指针为空,所有索引元素不重复,节点中的数据索引从左到右递增排列 BTree(B-Tree变种) 非叶…

Pytorch搭建GoogleNet神经网络

一、创建卷积模板文件 因为每次使用卷积层都需要调用Con2d和relu激活函数,每次都调用非常麻烦,就将他们打包在一起写成一个类。 in_channels:输入矩阵深度作为参数输入 out_channels: 输出矩阵深度作为参数输入 经过卷积层和relu激活函数…

Qt对象池,单例模式,对象池可以存储其他类的对象指针

代码描述: 写了一个类,命名为对象池(ObjectPool ),里面放个map容器。 3个功能:添加对象,删除对象,查找对象 该类只构建一次,故采用单例模式功能描述:对象池可…

04 MySQL --DQL 专题--Union、exists

1. UNION、UNION ALL UNION 关键字的作用? 合并两个或多个 SELECT 语句的结果。发挥的作用与 or 非常相似 UNION关键字生效的前提? 每个 SELECT 语句必须拥有相同数量的列。每个 SELECT 语句中的列的顺序必须相同。列必须拥有相似的数据类型。 SELEC…

WebRTC直播间搭建记录

考虑到后续增加平台直播的可能性,笔记记录一下WebRTC相关. 让我们分别分析两种情况下的WebRTC连接建立过程: 情况一:AB之间可以直接通信 1.信令交换: 设备A和设备B首先通过信令服务器交换SDP(Session Description Pr…

负载均衡集群——LVS

目录 1.LVS简介 2.LVS体系结构 3.LVS相关术语 4. LVS工作模式 5. LVS调度算法 6.LVS集群介绍 6.1 LVS-DR模式 6.2 LVS – NAT 模式 6.3 LVS – TUN 模式 7.LVS 集群构建 7.1 LVS/NAT 模式配置 实验操作步骤 步骤 1 Nginx1 和 Nginx2 配置 步骤 2 安装和配置 LVS …

R语言使用installr包对R包进行整体迁移

今天分享一个R语言的实用小技巧,如果咱们重新安装了电脑(我重装了电脑)或者因为需要卸载旧版本的R软件,安装新版本的R,那么必然会造成R包的库缺失,需要重新下载,有些还不是官方的R包&#xff0c…