手写代码实现卷积操作(Python)

手写代码实现卷积操作(Python)在卷积神经网络中,才用卷积技术实现对图片的降噪和特征提取。一般我们构建卷积神经网络都是使用成熟的框架,今天我就来自己实现一下卷积,并使用不同的卷积核来看看效果。卷积操作的原理可以由下图表示:一个3*3的卷积核,以滑动窗口的形式在图片上滑动,每滑动一次,就计算窗口中的数据的加权之和,权值就是卷积核的数据。通过这个过程将图片进行转化。准备图片数据:使用P…

大家好,又见面了,我是你们的朋友全栈君。

在卷积神经网络中,才用卷积技术实现对图片的降噪和特征提取。

一般我们构建卷积神经网络都是使用成熟的框架,今天我就来自己实现一下卷积,并使用不同的卷积核来看看效果。

 

卷积操作的原理可以由下图表示:

手写代码实现卷积操作(Python)

 一个3*3的卷积核,以滑动窗口的形式在图片上滑动,每滑动一次,就计算窗口中的数据的加权之和,权值就是卷积核的数据。

通过这个过程将图片进行转化。

 

准备图片数据:

手写代码实现卷积操作(Python)

 使用PIL库读取图片:

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

读取图片,并可视化:

img = Image.open('金鱼姬.jpg')
plt.axis("off")
plt.imshow(img)

手写代码实现卷积操作(Python)

 以灰度显示图片:

gray = img.convert('L')
plt.figure()
plt.imshow(gray, cmap='gray')
plt.axis('off')

 

手写代码实现卷积操作(Python)

 RGB三通道数据分离:

r, g, b = img.split()

        三色通道可视化:

plt.imshow(r, cmap='gray')
plt.axis('off')

手写代码实现卷积操作(Python)手写代码实现卷积操作(Python)手写代码实现卷积操作(Python)

 将图片数据转化为np矩阵:

np.array(img)
np.array(r)
np.array(g)
np.array(b)

单通道数据(r):

array([[ 52,  58,  55, ..., 139, 133,  91],
       [ 46,  53,  52, ..., 140, 138, 103],
       [ 45,  53,  52, ..., 142, 144, 119],
       ...,
       [ 40,  37,  37, ...,  60,  61,  47],
       [ 39,  36,  37, ...,  56,  58,  48],
       [ 35,  33,  35, ...,  54,  57,  48]], dtype=uint8)

定义卷积核:

#定义卷积核(3*3)
k = np.array([
    [0,1,2],
    [2,2,0],
    [0,1,2]
])

我们使用单通道图片数据进行卷积:

data = np.array(r)
n,m = data.shape

       可以看到,图片的大小为:720*1280

 

关键点来了,定义卷积函数(二维):

def convolution(k, data):
    n,m = data.shape
    img_new = []
    for i in range(n-3):
        line = []
        for j in range(m-3):
            a = data[i:i+3,j:j+3]
            line.append(np.sum(np.multiply(k, a)))
        img_new.append(line)
    return np.array(img_new)

采用双循环遍历图片数据,line存储一行卷积后的数据,img_new记录每一行卷积后的数据,形成新的图片

 

下面来看一看卷积结果:

img_new = convolution(k, data)#卷积过程

#卷积结果可视化
plt.imshow(img_new, cmap='gray')
plt.axis('off')

手写代码实现卷积操作(Python)

 因为卷积结果和卷积核有密切关系,虽然上图看上去没他大的区别,那是因为卷积核的关系。

 

我们来使用常见的几种卷积核来看看结果:

卷积核1:垂直边缘检测

k1 = np.array([
    [1,0,-1],
    [1,0,-1],
    [1,0,-1]
])

手写代码实现卷积操作(Python)

可以看到,图片中物体的纵向边界特征被提取出来,而其他的特征被弱化了

 

卷积核2:水平边缘检测

k2 = np.array([
    [1,1,1],
    [0,0,0],
    [-1,-1,-1]
])

手写代码实现卷积操作(Python)

可以看出,横向特征被凸显。

我们换一个,纵向特征比较明显的图片来试一下:

手写代码实现卷积操作(Python)

 例如该图中有很多竖向的扶手,我们看看他的卷积后的效果:

垂直边缘检测:

手写代码实现卷积操作(Python)

水平边缘检测:

手写代码实现卷积操作(Python)

这样看,特征就很明显了。

通过卷积后的图片,大小变化了,可以使用零填充技术使得输出图片和原图片大小一致,这里就不实现了,本文主要是实现卷积过程。

还有其他常用的卷积核,以下分别展示一下各自的效果:

 

sobel滤波(纵向,横向):

手写代码实现卷积操作(Python)手写代码实现卷积操作(Python)

scharr滤波(纵向,横向):

手写代码实现卷积操作(Python)手写代码实现卷积操作(Python)

 大家猜猜,最后我使用的是出自哪里的图片吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140232.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • SpringMVC 中ModelAndView用法

    SpringMVC 中ModelAndView用法ModelAndView作用1.返回到指定的页面ModelAndView构造方法可以指定返回的页面名称   例:returnnewModelAndView("redirect:/m07.jsp");通过setViewName()方法跳转到指定的页面   例:mav.setViewName("hello"); 2.返回参数到指定页面的request作用于中使…

  • 单调栈总结_进栈和出栈的算法思想

    单调栈总结_进栈和出栈的算法思想单调栈总结目录定义性质功能例题HDU1506HDU5033PKU2796PKU3250定义性质下面引自百度百科单调递增或单调减的栈,跟单调队列差不多,但是只用到它的一端,利用它可以用来解决一些ACM/ICPC和OI的题目,如RQNOJ的诺诺的队列等。单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性。假设下图是一个栈内元素的排列情况(单调递增的

  • Windows 打开和关闭默认共享方法汇总

    [原文]在使用xcopy上传文件至远程windows服务器时,出现“Invaliddriverspecification”(无效驱动器规格),经过各种排查,最终发现是服务器“关闭默认共享”导致的。Windows启动时都会默认打开admin$ipc$和每个盘符的共享,对于不必要的默认共享,一般都会把它取消掉,可当又需要打开此默认共享时,又该从哪里设置呢。经过自己的验证,汇总出一下方法。一:查看window共享资源运行–>cmd–>输入netshare二:彻底关闭

  • linux和windows文件名称长度限制

    linux和windows文件名称长度限制

    2021年11月17日
  • navicat15.0.23 激活码(最新序列号破解)

    navicat15.0.23 激活码(最新序列号破解),https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • latex打双引号“ “

    latex打双引号“ “latex中如果用英文输入模式的双引号键入,则输出的结果与我们预期的不符合,这并不是LaTeX的正确输入方式。”test”输出为:正确的输入方式为:引号左边输入两个反引号`,,引号右边输入两个单引号’。“test”输出为:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号