今天学习不同样式的核对图像的影响
基本可以分成高通滤波和低通滤波两种
#一些低通滤波器,就是取图像的低频成分,实际上就是把图像弄得模糊/平缓,消除噪音点,如之前学习的均值滤波和高斯滤波。
#一些高通滤波器,就是取图像的高频成分,实际上就是把图像进行锐化处理,使图像的边缘信息更加突出,如Sobel算子、Prewitt算子、锐化滤波器等;

第一部分:低通滤波器

import cv2
import numpy as np# 展示图像,封装成函数
def cv_show_image(name, img):cv2.imshow(name, img)cv2.waitKey(0)  # 等待时间,单位是毫秒,0代表任意键终止cv2.destroyAllWindows()# 一些核操作
# 第一部分:均值滤波和高斯滤波
img = cv2.imread('images/saoge.jpg')  # 读取原始图像
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)  # 图像太大,展示小点的。
cv_show_image('img_src', img)# 定义一个3x3的均值核,所有的权值都是一样的
kernel = np.array([[1/9, 1/9, 1/9],[1/9, 1/9, 1/9],[1/9, 1/9, 1/9]], np.float32)
dst = cv2.filter2D(img, -1, kernel=kernel)
cv_show_image('mean_kernel', dst)# 定义一个3x3的高斯核,离中心越近权值越重,离中心点越远,权值越小,权值的采样可以是使用正态分布的的采样
kernel = np.array([[1/16, 2/16, 1/16],[2/16, 4/16, 2/16],[1/16, 2/16, 1/16]], np.float32)
dst = cv2.filter2D(img, -1, kernel=kernel)
cv_show_image('gauss_kernel', dst)

均值滤波结果

高斯滤波结果

第二部分:锐化滤波

# 第二部分:图像锐化,突出中间像素,而抑制周边像素, 可以分为4-邻接和8邻接
# 例如 4-邻接
#      [[0, -1,  0],
#      [-1,  5, -1],
#      [ 0, -1, 0]]
# 例如 8-邻接
#      [[-1, -1, -1],
#      [-1,  9, -1],
#      [-1, -1, -1]]kernel = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]], np.float32)  # 定义一个3x3的锐化核
dst0 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst0)
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)  # 定义一个3x3的锐化核
dst1 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[0, -1, 0], [-1, 6, -1], [0, -1, 0]], np.float32)  # 定义一个3x3的锐化核
dst2 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst2)res = np.vstack((dst0, dst1, dst2))  # 垂直排列展示
cv2.imshow('Ruihua_k0_4', res)
cv2.waitKey(0)
cv2.destroyAllWindows()kernel = np.array([[-1, -1, -1], [-1, 7, -1], [-1, -1, -1]], np.float32)  # 定义一个3x3的锐化核
dst0 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]], np.float32)  # 定义一个3x3的锐化核
dst1 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]], np.float32)  # 定义一个3x3的锐化核
dst2 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst2)res = np.hstack((dst0, dst1, dst2))  # 水平排列展示
cv2.imshow('Ruihua_k1_8', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

多种4邻接核锐化效果

多种8邻接核锐化效果

第三部分:一阶微分核

# 第三部分:一阶微分算子
# 图像中物体的边缘往往就是变化较为剧烈的部分(高频部分),对于一个函数来说,变化越剧烈的地方,对应的导数的绝对值也就越大。
# 图像就是一种二元函数,f(x,y)表示(x,y)处像素的值,
# 因此导数除了大小,还有方向。那么求图像在某方向上的一阶导数(或称图像的梯度),也就可以反映出图像在该处的变化程度,变化程度越快,在该方向的垂直方向可能就存在物体的边缘。
# 一阶微分算子可以计算出某个方向上物体的边缘,但往往对噪声较为敏感,且边缘检测敏感度依赖于物体的大小。# Prewitt算子
# Prewitt算子就是对图像进行差分来近似对图像的某个部分求一阶导数。由于导数还具有方向性,
# 因此同样大小的Prewitt算子还有8种不同的类型,目的在于求上、下、左、右、左上、左下、右上、右下8个方向上的梯度。
# 例如向右梯度方向的算子
# [[-1, 0, 1],
#  [-1, 0, 1],
#  [-1, 0, 1]]
# 例如向右上梯度方向的算子
# [[ 0, 1, 1],
#  [-1, 0, 1],
#  [-1, -1, 0]]
# 例如向上梯度方向的算子
# [[1, 1, 1],
#  [0, 0, 1],
#  [-1, -1, -1]]
# 例如左上梯度方向的算子
# [[1, 1, 0],
#  [1, 0, -1],
#  [0, -1, -1]]
# 以此类推
kernel = np.array([[-1, -1, -1],[0, 0, 0],[1, 1, 1]], np.float32)  # 定义一个3x3的向下梯度的卷积核
dst_down = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst0)
kernel = np.array([[-1, 0, 1],[-1, 0, 1],[-1, 0, 1]], np.float32)  # 定义一个3x3的向右梯度的卷积核
dst_right = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst0)
kernel = np.array([[1, 0, -1],[1, 0, -1],[1, 0, -1]], np.float32)  # 定义一个3x3的向左梯度的卷积核
dst_left = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[1, 1, 1],[0, 0, 0],[-1, -1, -1]], np.float32)  # 定义一个3x3的向上梯度的卷积核
dst_up = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst2)res = np.hstack((dst_down, dst_right, dst_left, dst_up))  # 垂直排列展示
cv2.imshow('YiJie_Prewitt', res)
cv2.waitKey(0)
cv2.destroyAllWindows()# sobel 算子
# Sobel算子则是Prewitt算子的改进版,对中间的元素适当进行了加权,Sobel算子之于Prewitt算子类似于高斯滤波之于均值滤波。
# 同样Prewitt算子,Sobel算子一样考虑方向
# 例如向右梯度方向的算子
# [[-1, 0, 1],
#  [-2, 0, 2],
#  [-1, 0, 1]]
# 例如向右上梯度方向的算子
# [[ 0, 1, 2],
#  [-1, 0, 1],
#  [-2, -1, 0]]
# 例如向上梯度方向的算子
# [[1, 2, 1],
#  [0, 0, 1],
#  [-1, -2, -1]]
# 例如左上梯度方向的算子
# [[2, 1, 0],
#  [1, 0, -1],
#  [0, -1, -2]]
# 以此类推
kernel = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]], np.float32)  # 定义一个3x3的向下梯度的卷积核
dst_down = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst0)
kernel = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]], np.float32)  # 定义一个3x3的向右梯度的卷积核
dst_right = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst0)
kernel = np.array([[1, 0, -1],[2, 0, -2],[1, 0, -1]], np.float32)  # 定义一个3x3的向左梯度的卷积核
dst_left = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]], np.float32)  # 定义一个3x3的向上梯度的卷积核
dst_up = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst2)res = np.hstack((dst_down, dst_right, dst_left, dst_up))  # 垂直排列展示
cv2.imshow('YiJie_sobel', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

多种Prewitt算子效果

多种Sobel算子效果

第四部分:二阶微分核

# 第四部分:二阶算子
# Prewitt算子和Sobel算子都是近似对图像进行一阶导数的计算,只能提取出某个具体方向的边缘。
# 一个函数的二阶导数为0时,代表此处的一阶导数取得极值,对应地也就表明原函数在此处的变化最大。
# 因此往往还可以根据图像的二阶导数过零点的位置,来预测图像中变化最剧烈的地方,也许对应物体的边缘。
# 与一阶微分算子不同,这些二阶微分算子对边缘的计算具有旋转不变性,也就是可以检测出各个方向上的边缘。# Laplace算子
# Laplace算子可以近似计算出图像的二阶导数,具有旋转不变性,也就是可以检测出各个方向的边缘。
# Laplace算子分为两种,分别考虑4-邻接(D4)和8-邻接(D8)两种邻域的二阶微分。
# 例如一个3x3的4-邻接为
# 例如 4-邻接
#      [[0, -1,  0],
#      [-1,  4, -1],
#      [ 0, -1, 0]]
# 例如 8-邻接
#      [[-1, -1, -1],
#      [ -1,  8, -1],
#      [ -1, -1, -1]]
#
kernel = np.array([[0, -1, 0],[-1, 4, -1],[0, -1, 0]], np.float32)  # 定义一个3x3的向左梯度的卷积核
dst1 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, -1]], np.float32)  # 定义一个3x3的向上梯度的卷积核
dst2 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst2)res = np.hstack((dst1, dst2))  # 垂直排列展示
cv2.imshow('ErJie_Laplace', res)
cv2.waitKey(0)
cv2.destroyAllWindows()# LoG算子
# Laplace算子对噪声依然很敏感。因此常常先使用高斯滤波器对图像进行平滑操作,再使用Laplace算子计算二阶微分。
# 二者结合称为LoG算子(Laplacian of Gaussian),该算子可以更加稳定地计算图像的二阶微分。
# 例如一个常用的5x5的核为
#      [[0, 0,  1,   0, 0],
#       [0, 1,  2,   1, 0],
#       [1, 2,  -16, 2, 1],
#       [0, 1,  2,   1, 0],
#       [0, 0,  1,   0, 0]]
kernel = np.array([[0, 0,  1, 0, 0],[0, 1,  2,   1, 0],[1, 2,  -17, 2, 1],[0, 1,  2,   1, 0],[0, 0,  1,   0, 0]], np.float32)  # 定义一个3x3的向左梯度的卷积核
dst0 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[0, 0,  1, 0, 0],[0, 1,  2,   1, 0],[1, 2,  -16, 2, 1],[0, 1,  2,   1, 0],[0, 0,  1,   0, 0]], np.float32)  # 定义一个3x3的向左梯度的卷积核
dst1 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)
kernel = np.array([[0, 0,  1, 0, 0],[0, 1,  2,   1, 0],[1, 2,  -15, 2, 1],[0, 1,  2,   1, 0],[0, 0,  1,   0, 0]], np.float32)  # 定义一个3x3的向左梯度的卷积核
dst2 = cv2.filter2D(img, -1, kernel=kernel)
# cv_show_image('RuiHua', dst1)res = np.hstack((dst0, dst1, dst2))  # 垂直排列展示
cv2.imshow('ErJie_LoG', res)
cv2.waitKey(0)
cv2.destroyAllWindows()

Laplace算子效果

LoG算子

【opencv 学习】【常用的图像卷积核】相关推荐

  1. youcans 的 OpenCV 学习课—5.图像的几何变换

    youcans 的 OpenCV 学习课-5.图像的几何变换 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 几何变换是指对图像的位置.大小.形状.投影进行变换,是将图像从 ...

  2. youcans 的 OpenCV 学习课—4.图像的叠加与混合

    youcans 的 OpenCV 学习课-4.图像的叠加与混合 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的加法.叠加与混合,提供完整例程和运行结果:加法 ...

  3. C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)

    C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...

  4. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  5. youcans 的 OpenCV 学习课—3.图像的创建与修改

    youcans 的 OpenCV 学习课-3.图像的创建与修改 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. OpenCV 中图像的数据结构是 ndarray 多维数组, ...

  6. youcans 的 OpenCV 学习课—2.图像读取与显示

    youcans 的 OpenCV 学习课-2.图像读取与显示 本系列面向 Python 小白,从零开始实战解说 OpenCV 项目实战. 本节介绍图像的读取.保存和显示.除基本方法和例程外,还给出了从 ...

  7. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  8. [OpenCV学习笔记3][图像的加载+修改+显示+保存]

    正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...

  9. OpenCV学习笔记之图像融合

    一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围  内改变  ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...

最新文章

  1. 人脸和性别识别(基于OpenCV)
  2. 顽皮恶魔 牛客白月赛44
  3. VTK:多边形曲面等高线插值用法实战
  4. CreateFileMapping共享内存时添加Global的作用
  5. vue全局引入openlayers_vue中使用OpenLayers(一):引入谷歌地图
  6. Linux ss 热点,在Linux系统下的ss命令(socket statistics)各种使用示例
  7. vue数组变化视图_vue对象数组数据变化,页面不渲染
  8. 【JAVA中级篇】线程池
  9. java编写统计玩家总数的程序_JAVA程序:输出一组数后如何统计特定数的总数
  10. TensorFlow 中 identity 函数理解
  11. android 自定义 对号,Android自定义View实现打钩动画功能
  12. Mac x 10.12.4 如何安装sshfs
  13. MPLS 网络技术 — 组网方案
  14. Oracle数据库表空间数据文件最大容量以及存满时处理方法
  15. 软件工程师的职业道德与修养
  16. 华为手撕代码+剑指offer总结 (python+c语言)
  17. 适合糖友增强饱腹感的一些主食
  18. form表单的submit()和onsubmit()的区别
  19. U盘中毒后文件夹全部被变成系统隐藏文件,并生成同名文件夹带exe后缀
  20. 计算机配置好坏怎么看,怎么看电脑配置,电脑配置好坏信息一目了然-腾讯电脑管家...

热门文章

  1. HTTP3快来了,提前学习一下如何在Nginx中支持HTTP3.0/QUIC
  2. 面试官系统精讲Java源码及大厂真题 - 19 LinkedBlockingQueue 源码解析
  3. 容器编排技术 -- Kubernetes kubectl run 命令详解
  4. 使用Docker快速部署禅道V11.6版本
  5. 设置SGA的原则以及修改它的大小
  6. oracle 内核参数设置
  7. Oracle性能调优方法
  8. Redis面试 - 内存淘汰机制
  9. Java+Selenium+Testng自动化测试学习(三)— 断言
  10. CQRS之旅——旅程6(我们系统的版本管理)