本数字图像处理的学习系列是对课本知识的实现,完成课程相关的实验部分。
熟练掌握空域滤波中常见的平滑和锐化滤波器。
"""
# -*- coding :utf-8 -*-
# @Time:2022/3/159:17
# @Author:WEIKETAN
# @File:Image_smoothing.py
# @Desc:
"""
import cv2 as cv
import matplotlib
import numpy as np
from matplotlib import pyplot as plt
"""
前三个方法分别是均值滤波、高斯滤波、中值滤波,都是图像平滑的方法,目的去噪;
后三种方法分别是scharr算子、sobel算子(一阶微分)、拉普拉斯算子(二阶微分),目的增强边缘;
"""
def Meanfiltering():
"""
cv2读取图片是以BGR形式进行读取的,经过imshow函数会变成RGB形式
plt读取图片是以RGB形式进行读取的.
:return:
"""
# 1. 读取图片
img = cv.imread("F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\dogsp.jpeg")
# cv.imshow("img", img)
# img1 = plt.imread("F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\dog.jpeg")
# plt.imshow(img1)
# 2. 均值滤波
blurImg = cv.blur(img, (5, 5))
# 3. 图像显示
# 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
fig, axes = plt.subplots(ncols=2, figsize=(10, 8))
print(np.shape(img))
axes[0].imshow(img[:, :, ::-1]) # 原图片img是BGR格式,所以需要转换为RGB格式,即对原图片进行左右翻转
axes[0].set_title("原图")
axes[1].imshow(blurImg[:, :, ::-1])
axes[1].set_title("均值滤波后的结果")
plt.show()
def Gaussianfiltering():
# 1. 读取图片
img = cv.imread("F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\dogsp.jpeg")
# 2. 高斯滤波
GaussianBlurImg = cv.GaussianBlur(img, (3,3), 1)
# 3. 图像显示
# 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
fig, axes = plt.subplots(ncols=2,figsize=(10,8))
axes[0].imshow(img[:, :, ::-1]) # 原图片img是BGR格式,所以需要转换为RGB格式,即对原图片进行左右翻转
axes[0].set_title("原图")
axes[1].imshow(GaussianBlurImg[:, :, ::-1])
axes[1].set_title("高斯滤波后的结果")
plt.show()
def medianfiltering():
# 1. 读取图片
img = cv.imread(
"F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\dogGauss.jpeg")
# 2. 中值滤波
medianBlurImg = cv.medianBlur(img, 5)
# 3. 图像显示
# 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
fig,axes = plt.subplots(ncols=2,figsize=(10,8))
print(np.shape(img))
axes[0].imshow(img[:,:,::-1]) # 原图片img是BGR格式,所以需要转换为RGB格式,即对原图片进行左右翻转
axes[0].set_title("原图")
axes[1].imshow(medianBlurImg[:,:,::-1])
axes[1].set_title("中值滤波后的结果")
plt.show()
def scharrOperator():
# 1. 读取图片
img = cv.imread(
"F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\deer.jpeg")
# 2. 计算scharr卷积结果
"""
scharr参数:
src: 传入的图像
ddepth:图像的深度
dx和dy:指求导的阶数
ksize: 是scharr算子的大小,即卷积核的大小。 ksize=-1就是利用Scharr进行边缘检测
scale: 比例常数
borderType: 图像边界的模式
"""
x = cv.Sobel(img,cv.CV_16S,1,0,ksize=-1)
y = cv.Sobel(img,cv.CV_16S,0,1,ksize=-1)
# 3. 将数据进行转换
Scale_absX = cv.convertScaleAbs(x)
Scale_absY = cv.convertScaleAbs(y)
# 4. 结果合成到一起
result = cv.addWeighted(Scale_absX,0.5,Scale_absY,0.5,0)
# 5. 图像显示
# 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
fig,axes = plt.subplots(ncols=2,figsize=(10,8))
axes[0].imshow(img[:,:,::-1]) # 原图片img是BGR格式,所以需要转换为RGB格式,即对原图片进行左右翻转
axes[0].set_title("原图")
axes[1].imshow(result[:,:,::-1])
axes[1].set_title("scharr滤波后的结果")
plt.show()
def sobelOperator():
# 1. 读取图片
img = cv.imread(
"F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\deer.jpeg")
# 2. 计算Sobel卷积结果
"""
Sobel参数:
src: 传入的图像
ddepth:图像的深度
dx和dy:指求导的阶数
ksize: 是Sobel算子的大小,即卷积核的大小
scale: 比例常数
borderType: 图像边界的模式
"""
x = cv.Sobel(img, cv.CV_16S, 1, 0)
y = cv.Sobel(img, cv.CV_16S, 0, 1)
# 3. 将数据进行转换
Scale_absX = cv.convertScaleAbs(x)
Scale_absY = cv.convertScaleAbs(y)
# 4. 结果合成到一起
result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# 5. 图像显示
# 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
fig,axes = plt.subplots(ncols=2, figsize=(10, 8))
axes[0].imshow(img[:, :, ::-1]) # 原图片img是BGR格式,所以需要转换为RGB格式,即对原图片进行左右翻转
axes[0].set_title("原图")
axes[1].imshow(result[:, :, ::-1])
axes[1].set_title("sobel滤波后的结果")
plt.show()
def LaplaceOperator():
# 1. 读取图片
img = cv.imread(
"F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\deer.jpeg")
# 2. Laplace转换
"""
Laplace参数:
src: 传入的图像
ddepth:图像的深度
ksize: 是Sobel算子的大小,即卷积核的大小
scale: 比例常数
borderType: 图像边界的模式
"""
result = cv.Laplacian(img, cv.CV_16S,3)
# 3. 数据转换
Scale_abs = cv.convertScaleAbs(result)
# 4. 图像显示
# 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
fig,axes = plt.subplots(ncols=2,figsize=(10,8))
axes[0].imshow(img[:,:,::-1]) # 原图片img是BGR格式,所以需要转换为RGB格式,即对原图片进行左右翻转
axes[0].set_title("原图")
axes[1].imshow(Scale_abs[:,:,::-1])
axes[1].set_title("Laplacian滤波后的结果")
plt.show()
def CannyOperator():
# 1. 读取图片
img = cv.imread(
"F:\\Develop_Tools_Python\\Python_WorkSpace\\Notebook_Python_WorkSpace\\IMage_processing\\homeworks\\photo\\deer.jpeg")
# 2.canny边缘检测
"""
Canny参数:
img: 传入的图像
threshold1:minval,较小的阈值将间断的边缘连接起来
threshold2: maxval,较大的阈值检测图像中明显的边缘
"""
lowthreshold = 0
max_lowthreshold = 100
result = cv.Canny(img, lowthreshold, max_lowthreshold)
# 3. 图片显示
# 设置字体为楷体,解决显示字体乱码问题
matplotlib.rcParams['font.sans-serif'] = ['KaiTi']
fig, axes = plt.subplots(ncols=2, figsize=(10, 8))
axes[0].imshow(img[:, :, ::-1]) # 原图片img是BGR格式,所以需要转换为RGB格式,即对原图片进行左右翻转
axes[0].set_title("原图")
axes[1].imshow(result)
axes[1].set_title("Canny滤波后的结果")
plt.show()
if __name__ == '__main__':
# 1、均值滤波
# Meanfiltering()
# 2、高斯滤波
# Gaussianfiltering()
# 3、中值滤波
# medianfiltering()
# 4、scharr算子(sobel的加强版)
# scharrOperator()
# 5、sobel算子(一阶微分)
# sobelOperator()
# 6、拉普拉斯算子(二阶微分)
# LaplaceOperator()
# 7、Canny边缘检测
CannyOperator()
3、中值滤波
4. scharr算子
5. sobel算子
6. 拉普拉斯算子
7. canny边缘检测