和我一起入门OpenCV with Python Day5

二、语法介绍

(二)图像处理

  1. 图像平滑
    图像平滑从信号处理的角度看就是去除其中的高频信息,保留低频信息。因此我们可以对图像实施低通滤波。低通滤波可以去除图像中的噪声,对图像进行平滑。
  • 均值滤波
    速度快,但在去噪的同时去除了部分细节。
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()




在这里插入图片描述

浅浅总结一下,看结果好像差别不大,但是中值滤波对椒盐噪声来说尤其有用

  1. 边缘检测
    标识数字图像中亮度变化明显的点
  • 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
自己稍微简化了一下需要的内容
侵删

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值