图像的卷积处理

 

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

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

实验步骤

一、平滑卷积

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     

 

posted @ 2025-01-18 16:33  aiplus  阅读(89)  评论(0)    收藏  举报
悬浮按钮示例