最近在学习吴恩达老师课程时,当读到相关以下内容时:
卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。在这个视频中,你会看到卷积是如何进行运算的。
在之前的视频中,我说过神经网络的前几层是如何检测边缘的,然后,后面的层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体,这个例子中就是人脸。在这个视频中,你会看到如何在一张图片中进行边缘检测。
那么图片乘以过滤器真的可以边缘检测吗? vertical edges和horizontal edges怎么实现呢?
本着学习和研究的精神,利用numpy与opencv对图片进行相关处理
一、准备测试图片
建议准备一张线条清晰,不会太复杂的图片,以便于实现明显的效果, 附上自己的测试图
二、对卷积有一个初步的认识
这里指的是卷积滑动的计算和卷积输出的shape计算
滑动的计算为: 3x1+1x1+2x1+0x0+5x0+7x0-1x1-1x8-1x2
卷积后的shape计算: (i+2p-k)/s +1 => (6+2x0-3)/1 +1
三、代码实现
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
File Name:乘以过滤器真的可以边缘检测吗
Description :
Author : zhang
date:2019/9/25
-------------------------------------------------
Change Activity: 2019/9/25:
-------------------------------------------------
"""
__author__ = 'zhang'
import cv2
import numpy as np
def sumandmul(list1, list2):
# result = sum(a*b for a, b in zip(list1, list2))
result = np.sum(list1 * list2)
return result
def conv(weight, height, count, newimg, t):
while count:
if height - count >= t:
for i in range(0, weight):
if i >= t and i <= weight-t:
newimg[i-t, height-count-t] = sumandmul(image[i-t:i+1, height-count-t: height-count+1], filter)
if count == height:
count -= t
else:
count -= 1
if __name__ == '__main__':
# filter = np.array([[1, 0, -1], [1, 0, -1], [1, 0, -1]]) # 横向
filter = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]]) # 竖直方向
image = cv2.imread('1.jpg', 0)
weight, height = image.shape
t = 2 # 2 = ? + 2 *0 -3 +1 = ? - 2
newimg = np.zeros((int((weight + 2*0 - 3)/1 + 1), int((height + 2*0 - 3)/1 + 1)))
count = height
conv(weight, height, count, newimg, t)
cv2.imshow('one', newimg)
cv2.waitKey(0)
四、实现效果