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

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

卷积需要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.mzph.cn/news/821835.shtml

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

相关文章

怎么样在外网登录访问CRM管理系统?

一、什么是CRM管理系统? Customer Relationship Management,简称CRM,指客户关系管理,是企业利用信息互联网技术,协调企业、顾客和服务上的交互,提升管理服务。为了企业信息安全以及使用方便,企业…

智能零售:引领购物新时代

智能零售通过整合人工智能、物联网、大数据和机器学习等技术,正在彻底改变传统的购物模式,为消费者和零售商提供前所未有的效率和个性化体验。 智能零售利用消费者数据分析来提供个性化的购物推荐。无论是在线平台或是实体店内,智能系统都能…

【Redis 神秘大陆】008 常见Java客户端

八、Redis 的 Java 客户端 8.1 Jedis 连接池 单点连接池 Jedis 连接池基于 Common-Pool 连接池里面放置的是空闲连接,如果被使用 (borrow)掉,连接池就会少一个连接,连接使用完后进行放回 (return&#…

【大语言模型】如何让ChatGPT等LLM拥有记忆

我们现在在跟ChatGPT等生成式人工智能聊天时,都需要我们给定一个上下文,生成式AI才会根据我们问题结合上下文给出回答,他们并没有任何记忆。想象一下未来我们有一个AI机器人在我们的身边,每天它的记忆都会归零,你必须跟…

基于afx透明视频的视觉增强前端方案

作者 | 青玉 导读 本文介绍了增长前端团队自研的Webview框架下透明视频视觉增强方案,该方案在保证对视觉进行高度还原的同时可投入更少的开发成本,还能获得更优的前端性能表现。文章首先分析了市面上动画方案的优缺点,然后详细介绍了透明视频…

【备忘】利用FFMpeg读取视频第一帧作为封面

前言 以前做过类似项目,当时是利用php 执行cli命令的方式去读取视频第一帧,现在2024年了服务器环境的升级再使用这种方式也不好了,现在用新的方式去实现这个简单的功能。(有点困了不想写了) 实现步骤 前提要先安装f…

开发语言漫谈-rust

前面介绍C语言家族时忘掉了rust,紧急补一篇。我们称C语言家族是指他们的语法相似,类似这样的: if(){}else{}就是C家族的。C、C的传统领域就是系统底层、硬件接口方向。C/C没有垃圾内存回收机制,完全靠程序员的自觉天赋&#xff0…

Blender生成COLMAP数据集

最近在做3DGS方向,整理了一下Blender生成自己的数据集。 1 Introduction 在Blender中构建场景(light, object, camera),利用Blender的python脚本对其渲染,导出多视角下渲染出的RGB图和depth map,并将trans…

SpingBoot3相关

一、SpringBoot3-AOT与JIT介绍 1.1 AOT与JIT JIT(Just-in-Time,实时编译)Java跨平台的基础 AOT(Ahead-of-Time,预编译或提前编译),无法跨平台 1.2 AOT的优点 启动和运行速度快:传…

OpenHarmony开发实例:【新闻客户端】

介绍 本篇Codelab我们将教会大家如何构建一个简易的OpenHarmony新闻客户端(JS版本)。应用包含两级页面,分别是主页面和详情页面,两个页面都展示了丰富的UI组件,其中详情页的实现逻辑中还展示了如何通过调用相应接口&a…

BetterDisplay Pro for Mac 显示器校准和优化软件

BetterDisplay Pro for Mac是一款适用于Mac电脑的显示器校准和优化软件。它可以帮助用户校准显示器的颜色、亮度、对比度和伽马值等参数,使得显示器更加准确和清晰,提高用户的工作效率。 BetterDisplay Pro for Mac v2.0.11激活版下载 这款软件具有直观的…

RUST腐蚀服务器添加 TAGS标签教程

RUST腐蚀服务器添加 TAGS标签教程 大家好我是艾西,一个做服务器租用的网络架构师。我们自己搭建架设的服务器在steam展示面板看到跟别人的不一样是咋回事? 这个其实就是服务器的一个标签,那么主要的作用就是让大家在选择服务器时更快更直接的…

pyqt5中sys.argv和app.exec_()是什么意思

在Python的PyQt程序中,sys.argv 和 app.exec_() 是与程序启动和事件循环处理相关的两个概念。 sys.argv: sys 是Python标准库中的一个模块,它提供了一些函数和变量,用来与Python解释器进行交互。argv 是sys模块中的一个列表,它包含…

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

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

目标检测YOLO实战应用案例100讲-基于特征融合和预测细化的遥感图像目标检测(下)

目录 4.2 无锚方法CenterNet概述 4.3 特征增强和预测细化网络 4.3.1 中间监督的堆叠沙漏网络

课时97:脚本自动化_expect_语法实践

2.2.2 语法实践 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 赋值语法 赋值:tcl 使用“set”关键字来定义参数,不必指定变量值的类型,因为变量值的类型仅一种——字符串 样式:set varName …

手写spring IOC底层源码来模拟spring如何利用多级缓存解决循环依赖的问题

在文章开始之前,先来看一张spring IOC加载过程的脑图吧 Spring IOC的加载过程 首先,当我们去new了一个applicationContext,它底层呢就会把我们配置的bean进行扫描,然后创建成一个一个的beanDefinition放在我们的beanDefinitionMap中,此时就有了一切创造bean的原料信…

Linux crontab命令教程:如何设置和管理定时任务(附实例详解和注意事项)

Linux crontab命令介绍 crontab(全称:cron table),是Linux系统中用来定期执行任务的命令。它允许用户添加、删除或修改定时任务。crontab命令的名字来源于“cron table”,因为它使用了名为cron的任务调度程序来执行任…

计算机视觉动作识别——YOWO用于实时时空动作定位与识别的算法解析

摘要 时空动作定位要求将两种信息源整合到设计的架构中:(1) 来自先前帧的时间信息和(2) 来自关键帧的空间信息。当前的最先进方法通常使用单独的网络提取这些信息,并使用额外的机制进行融合以获得检测结果。YOWO是一个用于视频流中实时时空动作定位的统…

数图智慧零售解决方案,赋能零售行业空间资源价值最大化

数图智慧零售解决方案 赋能零售行业空间资源价值最大 在激烈的市场竞争中,如何更好地提升空间资源价值,提高销售额,成为行业关注的焦点。近日,NIQ发布的《2024年中国饮料行业趋势与展望》称,“在传统零售业态店内&…