之前在看卷积神经网络,很好奇卷积到底是什么,最后看到了这篇文章http://blog.csdn.net/zouxy09/article/details/49080029,讲得很清楚,这篇文章中提到了对图像的滤波处理就是对图像应用一个小小的卷积核,并给出了以下例子:

  对图像的卷积,opencv已经有实现的函数filter2D,注意,卷积核需要是奇数行,奇数列,这样才能有一个中心点。opencv卷积的简单实践如下:

import matplotlib.pyplot as plt
import pylab
import cv2
import numpy as np img = plt.imread("apic.jpg") #在这里读取图片 plt.imshow(img) #显示读取的图片
pylab.show() fil = np.array([[ -1,-1, 0], #这个是设置的滤波,也就是卷积核
[ -1, 0, 1],
[ 0, 1, 1]]) res = cv2.filter2D(img,-1,fil) #使用opencv的卷积函数 plt.imshow(res) #显示卷积后的图片
plt.imsave("res.jpg",res)
pylab.show()

  知道了原理以后,就想自己实现一个简单的卷积,卷积的过程如下,对于mxn的图像,用kxk的滤波依次扫描,扫描的过程就是把原图的矩阵和卷积核依次进行逐点相乘(wise-element)并求和(需要注意求和结果可能大于255或小于0),在卷积特征提取ufldl讲了卷积的具体过程。

  可以发现一个规律,就是卷积后的图像的大小为(m - k + 1)x(n - k + 1),写代码的时候需要根据这个规律来确定卷积后的图像的大小。

  根据原理,实现代码如下:

 import matplotlib.pyplot as plt
import pylab
import numpy as np def convolve(img,fil,mode = 'same'): #分别提取三个通道 if mode == 'fill':
h = fil.shape[0] // 2
w = fil.shape[1] // 2
img = np.pad(img, ((h, h), (w, w),(0, 0)), 'constant')
conv_b = _convolve(img[:,:,0],fil) #然后去进行卷积操作
conv_g = _convolve(img[:,:,1],fil)
conv_r = _convolve(img[:,:,2],fil) dstack = np.dstack([conv_b,conv_g,conv_r]) #将卷积后的三个通道合并
return dstack #返回卷积后的结果
def _convolve(img,fil): fil_heigh = fil.shape[0] #获取卷积核(滤波)的高度
fil_width = fil.shape[1] #获取卷积核(滤波)的宽度 conv_heigh = img.shape[0] - fil.shape[0] + 1 #确定卷积结果的大小
conv_width = img.shape[1] - fil.shape[1] + 1 conv = np.zeros((conv_heigh,conv_width),dtype = 'uint8') for i in range(conv_heigh):
for j in range(conv_width): #逐点相乘并求和得到每一个点
conv[i][j] = wise_element_sum(img[i:i + fil_heigh,j:j + fil_width ],fil)
return conv def wise_element_sum(img,fil):
res = (img * fil).sum()
if(res < 0):
res = 0
elif res > 255:
res = 255
return res img = plt.imread("photo.jpg") #在这里读取图片 plt.imshow(img) #显示读取的图片
pylab.show() #卷积核应该是奇数行,奇数列的
fil = np.array([[-1,-1,-1, 0, 1],
[-1,-1, 0, 1, 1],
[-1, 0, 1, 1, 1]]) res = convolve(img,fil,'fill')
print("img shape :" + str(img.shape))
plt.imshow(res) #显示卷积后的图片
print("res shape :" + str(res.shape))
plt.imsave("res.jpg",res)
pylab.show()

  使用图像水平边缘滤波和浮雕滤波的结果如下,效果和opencv结果一致:

  另外这里也有关于卷积c/c++实现:http://lodev.org/cgtutor/filtering.html

用python实现对图像的卷积(滤波)的更多相关文章

  1. 数学之路-python计算实战(19)-机器视觉-卷积滤波

    filter2D Convolves an image with the kernel. C++: void filter2D(InputArray src, OutputArray dst, int ...

  2. 【计算机视觉】OpenCV篇(6) - 平滑图像(卷积/滤波/模糊/降噪)

    平滑滤波 平滑滤波是低频增强的空间域滤波技术.空间域滤波技术即不经由傅立叶转换,直接处理影像中的像素,它的目的有两类:一类是模糊:另一类是消除噪音.空间域的平滑滤波一般采用简单平均法进行,就是求邻近像 ...

  3. python Tensorflow 实现图像的卷积处理

    1.convolution.py import numpy as np from sklearn.datasets import load_sample_images import tensorflo ...

  4. [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) ​ 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...

  5. Python图像处理丨图像腐蚀与图像膨胀

    摘要:本篇文章主要讲解Python调用OpenCV实现图像腐蚀和图像膨胀的算法. 本文分享自华为云社区<[Python图像处理] 八.图像腐蚀与图像膨胀>,作者: eastmount . ...

  6. 跟我学Python图像处理丨图像特效处理:毛玻璃、浮雕和油漆特效

    摘要:本文讲解常见的图像特效处理,从而让读者实现各种各样的图像特殊效果,并通过Python和OpenCV实现. 本文分享自华为云社区<[Python图像处理] 二十四.图像特效处理之毛玻璃.浮雕 ...

  7. 【python图像处理】图像的缩放、旋转与翻转

    [python图像处理]图像的缩放.旋转与翻转 图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图 ...

  8. 为什么用卷积滤波,而不是非常easy的在频率领域内进行数据的频率处理

    卷积.为了更好的"动态"滤波. 问题来了.为什么用卷积滤波.而不是非常easy的在频率领域内进行数据的频率处理? 为了强调我觉得的答案,已经用blog标题给出了.卷积.为了更好的& ...

  9. Win8Metro(C#)数字图像处理--2.10图像中值滤波

    原文:Win8Metro(C#)数字图像处理--2.10图像中值滤波  [函数名称] 图像中值滤波函数MedianFilterProcess(WriteableBitmap src) [函数代码] ...

随机推荐

  1. XJOI1652Matrix67的情书

    Matrix67的情书 恺撒大帝曾经使用过这样一种加密术:对于明文中的每个字母,恺撒大帝会用它后面的第t个字母代替.例如,当t=3时,字母A将变成C,字母B将变成D,--,字母Y将变成A,字母Z将变成 ...

  2. JAVA加密算法系列-AesEBC

    package ***; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java. ...

  3. Redis基础学习(四)—Redis的持久化

    一.概述      Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方 ...

  4. angularJS绑定数据中对标签转义的处理

    一.问题 默认情况下,angularJS绑定的数据为字符串文本,不会对其中包含的html标签进行转义生成格式化的文本.在实际工作时碰到接口返回的数据带有html格式时该如何处理. 二.解决办法 1.引 ...

  5. MySQL5.7下修改root密码

    本地安装了个mysql5.7,发现修改root密码和以往有区别了,特此记录下 进入mysql  更改密码: mysql> update mysql.user set authentication ...

  6. ArrayList和List主要区别 就是ArrayList类型不安全。

    什么是不安全? 1:List大家都知道初始化的时候需要定义其类型,例如 List<int> listTest = new List<int>():而ArrayList,例如:A ...

  7. My SQL数据库的安装与配置

    MySQL是一个关系型数据库管理系统.MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言 MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小.速度快.总体拥有成本低,尤 ...

  8. uoj#228 基础数据结构练习题

    题面:http://uoj.ac/problem/228 正解:线段树. 我们可以发现,开根号时一个区间中的数总是趋近相等.判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了.如果这个区间 ...

  9. [内存管理]管理图解v0.1 v0.2 v0.3

    内存管理图解v0.1 内存管理图解v0.2 内存管理图解v0.3 

  10. JQuery 中关于插入新元素的方法

    关于JQuery插入新内容的方法: append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - ...