图像的卷积处理

 

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

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

实验步骤

一、平滑卷积

1. 加载图像并可视化

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

3. 用均值卷积去噪声

4. 用中值卷积去噪

5. 用高斯卷积去噪

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

二、边缘卷积

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

2. 提取图像的多种边缘

   

1. 加载图像并可视化.

 

1
2
3
4
5
6
7
8
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是卷积核,是一个单通道的数组。如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核完成操作。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#定义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()

  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#用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是核的尺寸

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用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方向上的高斯核标准差;
1
2
3
4
5
6
7
8
9
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. 不同卷积核去噪效果对比

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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()

  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#提取图像的边缘
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     

 

posted @   aiplus  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2024-01-18 下载与安装DevEco Studio
2024-01-18 运行Hello World工程
2024-01-18 多端部署
2024-01-18 atkts 异同
2024-01-18 外卖:怎么点才健康?
2024-01-18 ark ts
2014-01-18 Factors 分解质因数
悬浮按钮示例
点击右上角即可分享
微信分享提示