|
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 | 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)
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 | 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)
mean5_kernel = np.array( 1 / 25 * np.ones([ 5 , 5 ]))
mean5_img = cv2.filter2D(noise_img, - 1 , mean5_kernel)
plt.figure(figsize = ( 10 , 15 ))
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 | median5_img = cv2.medianBlur(noise_img, 5 )
plt.figure(figsize = ( 10 , 15 ))
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 ))
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 ))
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 ))
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()

|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 分解质因数