二、语法介绍
(二)图像处理
- 图像平滑
图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。
- 均值滤波
速度快,但在去噪的同时去除了部分细节。
cv.blur(src, ksize, anchor, borderType)
参数:
- src:输入图像
- ksize:卷积核的大小
- anchor:默认值 (-1,-1) ,表示核中心
- borderType:边界类型
实战!
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("C:/Users/LEGION/Pictures/bqb/zao.jpg")
blur=cv.blur(img,(5,5))
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('quzao')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('lvbo')
plt.xticks([]), plt.yticks([])
plt.show()
运行结果
- 高斯滤波
cv2.GaussianBlur(src,ksize,sigmaX,sigmaY,borderType)
参数:
- src: 输入图像
- ksize:高斯卷积核的大小,注意 : 卷积核的宽度和高度都应为奇数,且可以不同
- sigmaX: 水平方向的标准差
- sigmaY: 垂直方向的标准差,默认值为0,表示与sigmaX相同
- borderType:填充边界类型
实战!
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("C:/Users/LEGION/Pictures/bqb/zao.jpg")
blur = cv.GaussianBlur(img,(5,5),1)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('yuan')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('gaussian')
plt.xticks([]), plt.yticks([])
plt.show()
运行结果:
- 中值滤波
cv.medianBlur(src, ksize )
实战!
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("C:/Users/LEGION/Pictures/bqb/zao.jpg")
blur = cv.medianBlur(img,5)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img[:,:,::-1]),plt.title('yuan')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur[:,:,::-1]),plt.title('medium')
plt.xticks([]), plt.yticks([])
plt.show()
浅浅总结一下,看结果好像差别不大,但是中值滤波对椒盐噪声来说尤其有用
- 边缘检测
标识数字图像中亮度变化明显的点
- Sobel检测算子
- 算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确。
- 很多实际应用的场合,sobel边缘是首选。
- Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是效率要求较高,而对细纹理不太关心的时候。
Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
参数:
-
src:传入的图像
-
ddepth: 图像的深度
-
dx和dy: 指求导的阶数,0表示这个方向上没有求导,取值为0、1。
-
ksize: 是Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。
注意:如果ksize=-1,就演变成为3x3的Scharr算子。 -
scale:缩放导数的比例常数,默认情况为没有伸缩系数。
-
borderType:图像边界的模式,默认值为cv2.BORDER_DEFAULT。
实战!
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("C:/Users/LEGION/Pictures/bqb/shu.jpg")
x = cv.Sobel(img, cv.CV_16S, 1, 0)
y = cv.Sobel(img, cv.CV_16S, 0, 1)
Scale_absX = cv.convertScaleAbs(x) # convert 转换 scale 缩放
Scale_absY = cv.convertScaleAbs(y)
#结果合成
result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('yuan')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(result,cmap = plt.cm.gray),plt.title('Sobel')
plt.xticks([]), plt.yticks([])
plt.show()
运行结果(好神奇好喜欢!):
- Laplacian检测算子
利用二阶导数检测边缘
laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
实战!
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("C:/Users/LEGION/Pictures/bqb/zao.jpg")
result = cv.Laplacian(img,cv.CV_16S)
Scale_abs = cv.convertScaleAbs(result)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('yuan')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(Scale_abs,cmap = plt.cm.gray),plt.title('Laplacian')
plt.xticks([]), plt.yticks([])
plt.show()
运行结果(略逊一筹哦)
- Canny边缘检测
据说是最优的嗷,等会儿看看
canny = cv2.Canny(image, threshold1, threshold2)
参数:
- image:灰度图(好特别,它要灰度图给我搞特殊嗷)
- threshold1: minval,较小的阈值将间断的边缘连接起来
- threshold2: maxval,较大的阈值检测图像中明显的边缘
实战!
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread("C:/Users/LEGION/Pictures/bqb/zao.jpg")
lowThreshold = 0
max_lowThreshold = 100
canny = cv.Canny(img, lowThreshold, max_lowThreshold)
plt.figure(figsize=(10,8),dpi=100)
plt.subplot(121),plt.imshow(img,cmap=plt.cm.gray),plt.title('yuan')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(canny,cmap = plt.cm.gray),plt.title('Canny')
plt.xticks([]), plt.yticks([])
plt.show()
运行结果(哦谢特什么亚我还是喜欢第一张物极必反了555)
操作大部分转自https://blog.csdn.net/qq_45066628/article/details/119353123
自己稍微简化了一下需要的内容
侵删