图像的卷积处理

news/2025/3/10 22:27:19/文章来源:https://www.cnblogs.com/flyingsir/p/18678578
 

实验名称:图像的卷积处理

实验描述:包含图像的平滑卷积和边缘卷积,通过实验观察和理解三种平滑卷积的差异性、理解边缘卷积提取图像边缘特征的作用。

实验步骤

一、平滑卷积

1. 加载图像并可视化

2. 生成带有雪花噪声的图像

3. 用均值卷积去噪声

4. 用中值卷积去噪

5. 用高斯卷积去噪

6. 不同卷积核去噪效果对比

二、边缘卷积

1.提取图像横向和纵向边缘

2. 提取图像的多种边缘

   

1. 加载图像并可视化.

 

import cv2
import matplotlib.pyplot as pltimg = cv2.imread("data/img_orig.jpg") 
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img, cmap='gray')
plt.show()

  

 

# 2. 生成带有雪花噪声的图像

import cv2
import matplotlib.pyplot as plt
import numpy as nph,w = img.shape[:2]
#雪花点数量
nums=5000  
#随机选择图像像素点的行列位置,
rows = np.random.randint(0, h, (5000))
cols = np.random.randint(0, w, (5000))
noise_img = img
#将雪花噪声加入到图像中,并进行可视化
for i in range(nums):noise_img[rows[i], cols[i]] = 255
plt.imshow(noise_img, cmap='gray')
plt.title('noise_img')
plt.show()

 

3. 用均值卷积去噪声

dst = cv2.filter2D(src,ddepth,kernel)
功能:对图像进行滤波处理

    • dst是返回值,表示进行卷积/滤波后得到的处理结果;
    • src是需要处理的原始图像;
    • ddepth是目标图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。
    • kernel是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作。

 

#定义3*3的均值卷积核
mean3_kernel = np.array([ 
[1/9, 1/9, 1/9], 
[1/9, 1/9, 1/9], 
[1/9, 1/9, 1/9] 
]) #用3*3卷积核进行图像去噪
mean3_img = cv2.filter2D(noise_img, -1, mean3_kernel) #可视化对比去噪前后的图像
plt.subplot(1,2,1)
plt.imshow(noise_img, cmap='gray')
plt.title('noise_img')
plt.subplot(1,2,2)
plt.imshow(mean3_img, cmap='gray')
plt.title('3*3 mean kernel')
plt.show()

  

 

#用3*3卷积和5*5卷积进行图像去噪,观察对比去噪效果
mean3_kernel = np.array([ 
[1/9, 1/9, 1/9], 
[1/9, 1/9, 1/9], 
[1/9, 1/9, 1/9] 
]) 
mean3_img = cv2.filter2D(noise_img, -1, mean3_kernel) 
#生成5*5的均值卷积核
mean5_kernel = np.array(1/25*np.ones([5,5])) 
mean5_img = cv2.filter2D(noise_img, -1, mean5_kernel)plt.figure(figsize=(10, 15))  #设置figure大小的宽和长(inch英寸)
plt.subplot(1,3,1)
plt.imshow(noise_img, cmap='gray')
plt.title('noise_img')
plt.subplot(1,3,2)
plt.imshow(mean3_img, cmap='gray')
plt.title('3*3 mean kernel')
plt.subplot(1,3,3)
plt.imshow(mean5_img, cmap='gray')
plt.title('5*5 mean kernel')
plt.show()

  

 

4. 用中值卷积去噪

dst = cv2.medianBlur(src,ksize)
功能:用中值滤波进行图像处理,将每一个像素点的值设置为该卷积核窗口内像素点灰度值得中值。

    • dst是返回值,表示进行卷积/滤波后得到的处理结果;
    • src是需要处理的原始图像;
    • ksize是核的尺寸

 

# 使用5*5的中值卷积进行去噪
median5_img = cv2.medianBlur(noise_img,5)#设置figure大小的宽和长(inch英寸)
plt.figure(figsize=(10, 15))  #对比观看噪声图像、5*5均值卷积后图像、5*5中值卷积后图像
plt.subplot(1,3,1)
plt.imshow(noise_img, cmap='gray')
plt.title('noise_img')
plt.subplot(1,3,2)
plt.imshow(mean5_img, cmap='gray')
plt.title('5*5 mean kernel')
plt.subplot(1,3,3)
plt.imshow(median5_img, cmap='gray')
plt.title('5*5 median kernel')
plt.show()

  

 

5. 用高斯卷积去噪

dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY)
功能:对图像进行高斯滤波

    • dst是返回值,表示进行卷积/滤波后得到的处理结果;
    • src是需要处理的原始图像;
    • ksize高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,也可以为零;
    • sigmaX为X方向上的高斯核标准偏差;
    • sigmaY为Y方向上的高斯核标准差;
5. 用高斯卷积去噪
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY)
功能:对图像进行高斯滤波dst是返回值,表示进行卷积/滤波后得到的处理结果;
src是需要处理的原始图像;
ksize高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数,也可以为零;
sigmaX为X方向上的高斯核标准偏差;
sigmaY为Y方向上的高斯核标准差;

  

 

6. 不同卷积核去噪效果对比

三种卷积滤波去噪:中值滤波去噪效果最好,高斯卷积滤波效果一般,均值卷积滤波效果一般,且模糊性明显。

plt.figure(figsize=(10, 15))  #设置figure大小的宽和长(inch英寸)
plt.subplot(1,3,1)
plt.imshow(mean5_img, cmap='gray')
plt.title('5*5 mean kernel')plt.subplot(1,3,2)
plt.imshow(median5_img, cmap='gray')
plt.title('5*5 median kernel')plt.subplot(1,3,3)
plt.imshow(gauss5_img, cmap='gray')
plt.title('5*5 Gauss kernel')
plt.show()

 

 

 

6. 不同卷积核去噪效果对比

三种卷积滤波去噪:中值滤波去噪效果最好,高斯卷积滤波效果一般,均值卷积滤波效果一般,且模糊性明显。

 

plt.figure(figsize=(10, 15))  #设置figure大小的宽和长(inch英寸)
plt.subplot(1,3,1)
plt.imshow(mean5_img, cmap='gray')
plt.title('5*5 mean kernel')plt.subplot(1,3,2)
plt.imshow(median5_img, cmap='gray')
plt.title('5*5 median kernel')plt.subplot(1,3,3)
plt.imshow(gauss5_img, cmap='gray')
plt.title('5*5 Gauss kernel')
plt.show()

  

 

 

 

 

 

 边缘卷积.ipynb

.提取图像横向和纵向边缘

 

import numpy as np
import cv2
import matplotlib.pyplot as pltimg = cv2.imread('data/c_book.jpg')
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#定义纵向边缘卷积核
l_edge_kernel = np.array([ 
[1, 0, -1], 
[1, 0, -1], 
[1, 0, -1] 
]) 
#对图像进行纵向边缘提取
l_edge_img = cv2.filter2D(img1, -1, l_edge_kernel) #定义横向边缘卷积核
t_edge_kernel = np.array([ 
[1, 1, 1], 
[0, 0, 0], 
[-1, -1, -1] 
]) 
#对图像进行横向边缘提取
t_edge_img = cv2.filter2D(img1, -1, t_edge_kernel) plt.figure(figsize=(15, 10))  #设置figure大小的宽和长(inch英寸)
plt.subplot(1,3,1)
plt.imshow(img1)
plt.title('original img')
plt.subplot(1,3,2)
plt.imshow(l_edge_img)
plt.title('l_edge_img')
plt.subplot(1,3,3)
plt.imshow(t_edge_img)
plt.title('t_edge_img')
plt.show()

  

 

#提取图像的边缘
edge_img = t_edge_img + l_edge_imgplt.figure(figsize=(15, 10))  #设置figure大小的宽和长(inch英寸)
plt.subplot(1,3,1)
plt.imshow(edge_img)
plt.title('edge_img')
plt.subplot(1,3,2)
plt.imshow(l_edge_img)
plt.title('l_edge_img')
plt.subplot(1,3,3)
plt.imshow(t_edge_img)
plt.title('t_edge_img')
plt.show()

  

 

 

# 2. 提取图像的多种边缘

#定义边缘卷积核1
edge_kernel1 = np.array([ 
[2, 1, 0], 
[1, 0, -1], 
[0, -1, -2] 
]) 
edge_img1 = cv2.filter2D(img1, -1, edge_kernel1) #定义边缘卷积核2
edge_kernel2 = np.array([ 
[-1, -1, -1], 
[-1, 8, -1], 
[-1, -1, -1] 
]) 
edge_img2 = cv2.filter2D(img1, -1, edge_kernel2) plt.figure(figsize=(15, 10))  #设置figure大小的宽和长(inch英寸)
plt.subplot(1,3,1)
plt.imshow(img1)
plt.title('original img')
plt.subplot(1,3,2)
plt.imshow(edge_img1)
plt.title('edge_img1')
plt.subplot(1,3,3)
plt.imshow(edge_img2)
plt.title('edge_img2')
plt.show()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
素材

1.  c_book.jpg   

 

2.img_orig.jpg     

 

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

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

相关文章

从单数据源到多数据源的探讨

今天我想简单地分享一下如何将一个老项目从单数据源切换为多数据源的过程。这个项目是一个使用 WAR 部署的传统 JSP Web 项目,运行在 JDK 1.7 环境下,项目中并没有使用 Spring Boot,而仅仅采用了 Spring MVC 框架。我的主要任务是将原本使用单一数据源的架构,升级为支持多数…

eclipse thymeleaf 离线安装

下载zip包 https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin/releases 选择zip包参考 https://www.cnblogs.com/jiduoduo/p/15525430.html

Cisco ISR 1000 Series IOS XE Release 17.16.1a ED

Cisco ISR 1000 Series IOS XE Release 17.16.1a EDCisco ISR 1000 Series IOS XE Release 17.16.1a ED 思科 1000 系列集成多业务路由器 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-isr-1000/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…

Cisco ISR 4000 Series IOS XE Release 17.16.1a ED

Cisco ISR 4000 Series IOS XE Release 17.16.1a EDCisco ISR 4000 Series IOS XE Release 17.16.1a ED 思科 4000 系列集成服务路由器 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-isr-4000/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org思…

卷积运算

对应位置数字相乘,求和。卷积核(或滤波器)的小窗口在输入数据上滑动,计算窗口覆盖区域的元素乘积之和,从而生成输出数据。 二维卷积 运算 1x7 + 2x6 + 3x5 + 4x4 = 50 1x6 + 2x2 + 3x4 + 4x2 = 30 彩色图像卷积运算; R 卷积运算 对应位置 乘积求和; G-green 绿色…

linux实现macos的timeMachine系统备份

在上一篇文章中,我们详细介绍了Btrfs文件系统的基本使用方法和核心原理。本文将重点讲解如何利用Btrfs的特性来实现系统备份功能。 实现原理其实很简单:Linux内核支持直接从Btrfs的子卷(subvolume)启动系统。基于这个特性,我们可以通过计划任务定期为系统根目录创建快照,…

btrfs文件系统从原理到实践 [1]

作为Linux用户,我经常羡慕macOS系统的Time Machine功能。Time Machine就像是系统的最后一道防线,无论系统发生什么变化,它都能保护我们的数据安全,避免因误操作导致系统无法启动的困境。那么,Linux系统下是否也有类似的解决方案呢?基于这样的需求,我发现了Btrfs文件系统…

常用图像增强算法(MATLAB实现)

1 引言 图像增强是指按照某种特定的需求,突出图像中有用的信息,去除或者削弱无用的信息。图像增强的目的是使处理后的图像更适合人眼的视觉特性或者易于机器识别。在医学成像、遥感成像、人物摄影等领域,图像增强技术都有着广泛的应用。图像增强同时可以作为目标识别,目标跟…

【PE文件结构】导入表

导入表(Import Table)是Windows可执行文件中的一部分,它记录了程序所需调用的外部函数(或API)的名称,以及这些函数在哪些动态链接库(DLL)中可以找到。在PE文件运行过程需要依赖哪些模块,以及依赖这些模块中的哪些函数,这些信息就记录在导入表中。在Win32编程中我们会…

ciscn_2019_es_2(栈迁移)

看一下ida两个read函数都是读取0x30(48),然后s距离ebp有0x28(40),所以虽然有溢出但只溢出了两个4字节,也就是只能覆盖到ebp和ret。 这时候就需要运用栈迁移 栈迁移就是当溢出不够多的时候,这时候可以考虑把栈给迁移去其它地方,利用leave_ret指令控制ebp,使其指向我们…

Nexpose 7.3.0 for Linux Windows - 漏洞扫描

Nexpose 7.3.0 for Linux & Windows - 漏洞扫描Nexpose 7.3.0 for Linux & Windows - 漏洞扫描 Rapid7 on-prem Vulnerability Management, released Jan 15, 2025 请访问原文链接:https://sysin.org/blog/nexpose-7/ 查看最新版。原创作品,转载请保留出处。 作者主页…

ABB机器人3HNE00313-1示教器黑屏故障维修

随着工业自动化的快速发展,ABB机器人示教器在生产线上的应用越来越广泛。然而,在使用过程中,示教器偶尔也会出现故障,其中比较常见的一种是ABB工业机械手示教器黑屏故障。 一、ABB工业机器人示教盒黑屏故障原因分析 1. 硬件故障:硬件故障是导致示教器黑屏的主要原因之一。…