实验名称:图像的卷积处理 实验描述:包含图像的平滑卷积和边缘卷积,通过实验观察和理解三种平滑卷积的差异性、理解边缘卷积提取图像边缘特征的作用。 实验步骤 一、平滑卷积 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)
#定义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)
# 使用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)
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
|