首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV学习+常用函数记录②:图像卷积与滤波

OpenCV学习+常用函数记录②:图像卷积与滤波

作者头像
小黑鸭
发布2020-11-24 10:51:32
5490
发布2020-11-24 10:51:32
举报

OpenCV 图像卷积

    • 2.1 图像卷积
    • 2.2 均值滤波
    • 2.3 中值滤波
    • 2.4 高斯模糊
    • 2.5 Sobel算子
    • 2.6 拉普拉斯算子
    • 2.7 Canny边缘检测算法
    • 2.8 双边滤波
    • 2.9 锐化滤波
  • 最近因项目需要加上自己的兴趣,需要用一些opencv相关的东西,虽然之前零零碎碎学习过一些,但是很久不用就忘了,打算写篇文章总结一下学习的过程以及一些常用的函数。类似的博文有很多,但还是觉得自己总结一编印象深一些。

2.1 图像卷积

在这里插入图片描述
在这里插入图片描述
dst = cv.filter2D(图像, -1, kernel)

2.2 均值滤波

核心API:cv.blur(图像,卷积核)

2.3 中值滤波

核心API:cv.medianBlur(图像,卷积核)

2.4 高斯模糊

核心API:cv.GaussianBlur(图像, (卷积核), 标准差)

代码示例

import cv2 as cv
import numpy as np

kernel = np.ones((3, 3), np.float32)/9
print kernel

src = cv.imread("../img/salt.jpg")
cv.imshow("src", src)

dst = cv.filter2D(src, -1, kernel)					# 均值滤波
cv.imshow("dst", dst)

dst2 = cv.blur(src, (3, 3))								# 均值滤波
cv.imshow("dst2", dst2)

dst3 = cv.medianBlur(src, 5)						# 中值滤波
cv.imshow("dst3", dst3)

dst4 = cv.GaussianBlur(src, (3, 3), 5)		# 高斯模糊
cv.imshow("dst4", dst4)

cv.waitKey()

2.5 Sobel算子

Sobel算子是像素图像边缘检测 中最重要的算子之一,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值。

在图像的任何一点使用此算子,将会产生该点对应的 梯度矢量

import cv2 as cv

src = cv.imread("../img/brain.jpg")

# sobel算子  参数1:图像, 参数2:图像的深度 -1表示和原图相同, 参数3: x方向求导的阶数 参数4: y方向求导的阶数
x_sobel = cv.Sobel(src, cv.CV_32F, 1, 0)
# 将图像转成8位int
x_sobel = cv.convertScaleAbs(x_sobel)

# sobel算子  参数1:图像, 参数2:图像的深度 -1表示和原图相同, 参数3: x方向求导的阶数 参数4: y方向求导的阶数
y_sobel = cv.Sobel(src, cv.CV_16S, 0, 1)
# 将图像转成8位int
y_sobel = cv.convertScaleAbs(y_sobel)

# 将x,y方向的内容叠加起来
xy_sobel = cv.addWeighted(x_sobel, 0.5, y_sobel, 0.5, 0)

cv.imshow("src", src)
cv.imshow("x_sobel", x_sobel)
cv.imshow("y_sobel", y_sobel)
cv.imshow("xy_sobel", xy_sobel)
cv.waitKey()

由于使用Sobel算子计算的时候有一些偏差, 所以opencv提供了sobel的升级版Scharr函数,计算比sobel更加精细.

import cv2 as cv

img = cv.imread("../img/brain.jpg",cv.IMREAD_GRAYSCALE)
cv.imshow("src",img)

# sobel算子
x_scharr = cv.Scharr(img, cv.CV_32F, 1, 0)
# 将图像转成8位int
x_scharr = cv.convertScaleAbs(x_scharr)
cv.imshow("x scharr",x_scharr)

# # sobel算子
y_scharr = cv.Scharr(img, cv.CV_16S, 0, 1)
# 将图像转成8位int
y_scharr = cv.convertScaleAbs(y_scharr)
cv.imshow("y scharr",y_scharr)

# 将x,y方向的内容叠加起来
xy_scharr = cv.addWeighted(x_scharr, 0.5, y_scharr, 0.5,0)
cv.imshow("x,y scharr",xy_scharr)

cv.waitKey(0)
cv.destroyAllWindows()

2.6 拉普拉斯算子

通过拉普拉斯变换后增强了图像中灰度突变处的对比度,使图像中小的细节部分得到增强,使图像的细节比原始图像更加清晰。

import cv2 as cv

img = cv.imread("../img/hehua.jpg", cv.IMREAD_GRAYSCALE)

# 使用拉普拉斯算子
dst = cv.Laplacian(img, cv.CV_32F)

# 取绝对值,将数据转到uint8类型
dst = cv.convertScaleAbs(dst)

cv.imshow("src", img)
cv.imshow("dst", dst)

cv.waitKey(0)
cv.destroyAllWindows()

2.7 Canny边缘检测算法

Canny算法一种多阶段算法,内部过程共4个阶段:

  1. 噪声抑制(通过Gaussianblur高斯模糊降噪):使用5x5高斯滤波器去除图像中的噪声
  2. 查找边缘的强度及方向(通过Sobel滤波器)
  3. 应用非最大信号抑制(Non-maximum Suppression): 完成图像的全扫描以去除可能不构成边缘的任何不需要的像素
  4. 高低阈值分离出二值图像(Hysteresis Thresholding)
  5. 高低阈值比例为T2:T1 = 3:1 / 2:1
  6. T2为高阈值,T1为低阈值
在这里插入图片描述
在这里插入图片描述
import cv2 as cv
import numpy as np
import random

# 将图片数据读取进来
img = cv.imread("../img/hehua.jpg", cv.IMREAD_COLOR)

# 1. 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 2. canny算法
dstImg = cv.Canny(grayImg, 50, 180)

# 显示
cv.imshow("img", img)
cv.imshow('dstimg', dstImg)
cv.waitKey(0)

2.8 双边滤波

双边滤波其综合了高斯滤波器和α-截尾均值滤波器的特点,同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。高斯滤波器只考虑像素间的欧式距离,其使用的模板系数随着和窗口中心的距离增大而减小;α-截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉α%的最小值和最大值后再计算均值。

核心API:cv.bilateralFilter(输入图像, d, sigmaColor, sigmaSpace)

src 输入图像 d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从sigmaSpace计算该值。 sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。 sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色.

import cv2 as cv

# 将图片数据读取进来
img = cv.imread("../img/timg.jpg", cv.IMREAD_COLOR)

# 双边滤波
dstImg = cv.bilateralFilter(img, 10, 50, 50)

# 显示图像
cv.imshow('img', img)
cv.imshow('newimg', dstImg)
cv.waitKey(0)

2.9 锐化滤波

import cv2 as cv
import numpy as np

img = cv.imread("../img/hehua.jpg", cv.IMREAD_COLOR)
cv.imshow("src", img)

k = 1

kernel = np.array([
                    [-k, -k, -k],
                    [-k, 8*k+1, -k],
                    [-k, -k, -k]])

dst = cv.filter2D(img, -1, kernel)

cv.imshow("sharpness filter", dst)

cv.waitKey(0)
cv.destroyAllWindows()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenCV 图像卷积
  • 2.1 图像卷积
  • 2.2 均值滤波
  • 2.3 中值滤波
  • 2.4 高斯模糊
  • 2.5 Sobel算子
  • 2.6 拉普拉斯算子
  • 2.7 Canny边缘检测算法
  • 2.8 双边滤波
  • 2.9 锐化滤波
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档