使用 OpenCV 将卷积实现为图像过滤器

卷积简介
卷积是计算机视觉 (CV) 中的一个流行术语。在讨论如何实现 CV 任务时,经常会提到卷积神经网络。因此,任何 CV 追求者都必须完全理解“卷积”一词。
卷积是几个图像处理运算符使用的基本数学运算。卷积是一种将两个整数数组相乘的方法,通常大小不同但维数相同,以产生具有相同维度的第三个数组。
卷积的应用包括信号处理、统计学、概率、工程、物理学、计算机视觉、图像处理、声学等等。
图像处理包括图像滤波、噪声去除、图像识别、图像分割等,卷积在图像滤波中发挥着很大的作用。

使用卷积进行图像过滤

图像过滤是将特定图像的像素值更改为模糊、锐化、浮雕或使边缘更清晰。它改变了原始图像的外观。如今,许多图像过滤器正在主导社交媒体应用程序。
大多数使用 Instagram 的人可能知道其中使用的图像过滤器。图像过滤是特定于应用程序的,因为有时我们需要模糊图像,有时我们希望图像具有较高清晰度。
图像过滤器非常易于使用。学习它背后的数学和图像处理是非常有趣的。图像过滤器使用各种卷积核来执行不同的图像过滤。
卷积滤波器(有时称为内核)与图像一起使用以实现模糊、锐化、浮雕、边缘检测和其他效果。这是通过内核和图像的卷积来执行的。核通常是 3×3 矩阵,卷积过程正式描述如下:
g(x,y)=w*f(x,y)
其中 g(x,y) 表示滤波后的输出图像,f(x,y) 表示原始图像,w 表示滤波器内核。下图显示了卷积的工作原理。
卷积过程讲解【1】
因此,上图清楚地表明,如果我们更改内核,输出将发生变化。有许多卷积核用于锐化、模糊或平滑图像。下表显示了各种内核及其效果。
表格1:各种内核及其作用

各种图像过滤的卷积实现

1. 框模糊

框模糊是一种简单的模糊,其中每个像素都设置为其周围像素的平均值。它可以写成两个函数 f[n] 和 g[n] 的离散卷积,其中 f[n] 表示图像的离散像素值,g[n] 是我们的内核,它是一个矩阵,表示为
实施步骤:
第 1 步:打开谷歌colab notebook
谷歌colab被用于实施。Colaboratory,或简称“Colab”,使你能够在浏览器中编写和运行 Python
  • 无需配置
  • 免费使用 GPU
  • 简单分享
无论你是学生、数据科学家还是 AI 研究人员,Colab 都可以为你提供帮助。要开始使用 Google Colab,请搜索“google colab”并单击第一个链接。然后选择“创建新笔记本”。你现在已准备好开始编写代码。
第 2 步:导入库
import cv2
import numpy as np
import matplotlib.pyplot as plt
第 3 步:读取图像并绘制它
image = cv2.imread('/content/1.PNG')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
fig, ax = plt.subplots(1, figsize=(12,8))
plt.imshow(image)
第 4 步:制作内核并应用卷积
让我们制作一个用于模糊图像的内核。我们将使用 Numpy 构建一个 3×3 的矩阵,并将其除以 9,如图 1 所示。filter2D() 函数给出输入数组和内核的卷积。
abc=np.ones((3,3))
kernel = np.ones((3, 3), np.float32) / 9
img = cv2.filter2D(image, -1, kernel)
fig, ax = plt.subplots(1,2,figsize=(10,6))
ax[0].imshow(image)
ax[1].imshow(img)
Box Blur的输出:

2. 锐化

图像锐化用于锐化图像。图像锐化的三个主要原因:
  1. 为了克服相机引入的模糊
  2. 引起对特定领域的注意
  3. 以增加可读性
任何当前相机的原始数据总是略微不清晰。在图像捕获过程的每个阶段都会引入模糊。
首先,无论制作多么精细,当光线穿过镜头元件时,都会丢失一些清晰度。其次,当传感器处理落在其上的光子时,最尖锐的过渡被平均化并略微模糊。最后,当插入三个不同的颜色通道以创建最终图像时,会引入适度的模糊。
其次,对比度吸引人的眼睛。当我们看一张照片时,我们的注意力会被最精美的元素所吸引。因此,如果你想引导观众的注意力,选择性锐化是实现这一目标的最佳技术之一。
最后,增强图像可以提高基本元素的可见性。例如,文本变得更容易阅读,单个叶子变得更加明显,人群中的面孔变得更加清晰。锐化是用下面的内核完成的。
执行
以下是在图像中进行锐化的代码,
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('/content/1.PNG')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
kernel = np.array([[0, -1, 0],
                   [-1, 5, -1],
                   [0, -1, 0]])
img = cv2.filter2D(image, -1, kernel)
fig, ax = plt.subplots(1,2,figsize=(10,6))
ax[0].imshow(image)
ax[1].imshow(img)
锐化的输出:

3. 浮雕

浮雕意味着形成一个从表面伸出的3D模具。当对图片应用浮雕滤镜时,生成的图像类似于浮雕 - 原始图像的纸或金属浮雕,其中特征以高浮雕(更突出)或低浮雕(不那么突出)突出. 以下是用于图像浮雕的卷积核……
执行
为了实现图像浮雕,我们必须遵循与框模糊中解释的相同的过程。唯一的变化是它的内核。
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread('/content/1.PNG')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
kernel = np.array([[-2, -1, 0],
                   [-1, 1, 1],
                   [0, 1, 2]])
img = cv2.filter2D(image, -1, kernel)
fig, ax = plt.subplots(1,2,figsize=(10,6))
ax[0].imshow(image)
ax[1].imshow(img)
浮雕输出:
因此,如表 1 所示,你可以更改内核,因此你可以拥有各种图像过滤器。

结束语

卷积只不过是一个简单的数学函数,用于各种图像过滤技术。卷积使用一个2输入矩阵:即图像矩阵和核。在此帮助下,通过执行卷积,它生成输出。当你更改内核时,你还可以注意到输出中的更改。

参考

  1. http://cse3521.artifice.cc/images/3d_convolution_animation.gif
  2. https://setosa.io/ev/image-kernels/
  3. https://www.sciencedirect.com/topics/computer-science/convolution-filter
☆ END ☆
(0)

相关推荐

  • DL之HNN:基于HNN(subplot)将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字

    DL:基于HNN将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字 输出结果 代码设计 #DL:基于HNN将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字 import ...

  • 什么是单应性矩阵?

    重磅干货,第一时间送达 你们是否知道人工智能正在改变体育产业?AI助教在比赛前和比赛中能帮助教练增强战略决策,通过使用高速相机和可穿戴传感器,人工智能现在可以测量场上每个球员的运动和位置.但是,AI如 ...

  • python+opencv图像处理(十二)

    图像仿射变换和透视变换 天晴了...... 1.仿射变换 图像的仿射变换就是图像的旋转加上拉升,说直白点,就是把矩形变成平行四边形. 要把矩形变成平行四边行,只需要拉伸其四个角点就行了,事实上,只需要 ...

  • 在 Google Colab 中使用 OpenCV 进行图像处理简介

    重磅干货,第一时间送达 在这篇文章中,我们将实现如何使用 OpenCV 在 google colaboratory 中进行图像处理.为此,我们应该了解一些 Python 基础知识,下面给出的步骤将帮助 ...

  • python进阶—OpenCV之图像处理(一)

    文章目录 颜色空间转换 RGB色彩空间 HSV色彩空间 YUV色彩空间 简单的物体跟踪示例 HSV空间目标阈值选取 图像几何变换 图像的缩放 图像的位移 图像的旋转 图像的仿射 图像的投射 图像阈值( ...

  • 基于OpenCV的图像强度操作

    重磅干货,第一时间送达 01. 什么是图像强度操作 更改任何通道中的像素值 对图像的数学运算 亮度变化 对比度变化 伽玛操纵 直方图均衡 图像预处理中的滤波等增强 使用OpenCV加载图像 impor ...

  • python数字图像处理(三)边缘检测常用算子

    在该文将介绍基本的几种应用于边缘检测的滤波器,首先我们读入saber用来做为示例的图像 #读入图像代码,在此之前应当引入必要的opencv matplotlib numpysaber = cv2.im ...

  • 使用Python可视化卷积神经网络方法汇总

    仅做学术分享,如有侵权,联系删除 转载于 :深度学习与计算机视觉 https://www.analyticsvidhya.com/blog/2018/03/essentials-of-deep-lea ...

  • 基于OpenCV的实用图像处理操作

    重磅干货,第一时间送达 图像处理适用于图像和视频.良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度学习的结果等.今 ...

  • python 读取并显示图片的两种方法

    在 python 中除了用 opencv,也可以用 matplotlib 和 PIL 这两个库操作图片.本人偏爱 matpoltlib,因为它的语法更像 matlab. 一.matplotlib 1. ...