首页 > 其他分享 >图像的卷积处理

图像的卷积处理

时间:2025-01-18 16:45:12浏览次数:1  
标签:plt img title 卷积 imshow 处理 edge 图像

 

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

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

实验步骤

一、平滑卷积

1. 加载图像并可视化

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

3. 用均值卷积去噪声

4. 用中值卷积去噪

5. 用高斯卷积去噪

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

二、边缘卷积

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

2. 提取图像的多种边缘

   

1. 加载图像并可视化.

 

import cv2
import matplotlib.pyplot as plt


img = 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 np

h,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 plt

img = 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_img

plt.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     

 

标签:plt,img,title,卷积,imshow,处理,edge,图像
From: https://www.cnblogs.com/flyingsir/p/18678578

相关文章

  • 集成AI离线免费,全平台毫秒级快速处理!
    随着PS技术的发展,大家对图像的要求和处理更加的多样化,其中,抠图作为一种常见的图像处理操作,并不是每个小伙伴都完全掌握PS技能,对于那些复杂的抠图操作往往会显得捉襟见肘,近两年随着AI技术的进步,各类软件都和AI集合,希望通过AI快速、高效的实现某些操作;分享一款免费、离线并且......
  • 卷积运算
      对应位置数字相乘,求和。  卷积核(或滤波器)的小窗口在输入数据上滑动,计算窗口覆盖区域的元素乘积之和,从而生成输出数据。二维卷积运算    1x7+2x6+3x5+4x4=50   1x6+2x2+3x4+4x2=30        彩色图像卷积运算; ......
  • Git三路合并算法完全指南:优雅处理复杂冲突[2]
    在使用git作为协作工具时,常常因为不熟悉git的三路合并算法而出现冲突,导致不敢随便提交代码,这里就来为大家解释下git三路合并算法的完全指南。三路合并三路合并算法的名称源于其合并过程中涉及的三个代码版本。在标准的Git开发流程中,开发者从生产分支fork出新分支进行开发,完成开......
  • 常用图像增强算法(MATLAB实现)
    1引言图像增强是指按照某种特定的需求,突出图像中有用的信息,去除或者削弱无用的信息。图像增强的目的是使处理后的图像更适合人眼的视觉特性或者易于机器识别。在医学成像、遥感成像、人物摄影等领域,图像增强技术都有着广泛的应用。图像增强同时可以作为目标识别,目标跟踪,特征点匹......
  • JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请
    目录JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)一、什么时候该使用Array.map(),与forEach()的区别是什么?1、什么时候该用Array.map()2、Array.map()与Array.forEach()的......
  • 从支付宝P0事故处理方案,合理推测损失金额
    支付宝昨天(2024-01-16)的无差别"送钱"的事儿,大家都知道了吧。具体的,就是在昨天14:40~14:45期间,所有支付宝的支付订单都被减免了20%,减免原因在界面上显示为"政府补贴"。这里指的订单,是指所有通过支付宝产生的交易,包括「购物、信用卡、生活缴费、个人转账」等等,而且和此前(消......
  • 深度学习中的迁移学习:使用预训练模型进行图像分类
    深度学习中的迁移学习:使用预训练模型进行图像分类介绍迁移学习是一种机器学习方法,其中一个模型在某个任务上进行预训练,并将该知识转移到新的但相关的任务中。深度学习中的迁移学习常用于图像分类,通过利用预训练模型(例如VGG、ResNet、Inception等)显著减少新任务所需的训......
  • 如何处理服务器端口开放问题?
    在使用宝塔面板配置服务器时,发现9501端口虽然已经放行,但仍然无法正常使用。如何确保9501端口能够正常工作?答案:服务器端口开放问题是许多用户在配置服务器时常见的挑战。要确保9501端口能够正常工作,您需要按照以下步骤进行排查和配置:确认服务是否监听端口:首先,确保有相应的服......
  • 【GMTSAR】虚拟机Ubuntu22.04使用GMTSAR进行D-InSAR和SBAS-InSAR处理
    近期学习了一下GMTSAR,记录一下使用过程电脑为处理器为i7-13700K,给虚拟机分配了32G内存。大致的处理流程命令如下(因为懒得截图以及复制起来简单直接写在了txt文本里)虚拟机挂载共享文件夹虚拟机的安装教程CSDN有很多,可以看最新的教程,去官网下载新版(但是要创建账号填写相关......
  • 图像形态学(腐蚀与膨胀讲解)+
     练习题目己知一幅二值目标图像A和结构元素B如下图所示,其中结构元素B的原点由小三角形标识。请分别写出结构元素B对值图像A进行腐蚀运算与膨账运算的结果。腐蚀操作(计算)定义        腐蚀操作是形态学图像处理中的基本操作之一。它通过一个结构元(也称为卷积核)对图......