之前在看卷积神经网络,很好奇卷积到底是什么,最后看到了这篇文章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实现对图像的卷积(滤波)的更多相关文章
-
数学之路-python计算实战(19)-机器视觉-卷积滤波
filter2D Convolves an image with the kernel. C++: void filter2D(InputArray src, OutputArray dst, int ...
-
【计算机视觉】OpenCV篇(6) - 平滑图像(卷积/滤波/模糊/降噪)
平滑滤波 平滑滤波是低频增强的空间域滤波技术.空间域滤波技术即不经由傅立叶转换,直接处理影像中的像素,它的目的有两类:一类是模糊:另一类是消除噪音.空间域的平滑滤波一般采用简单平均法进行,就是求邻近像 ...
-
python Tensorflow 实现图像的卷积处理
1.convolution.py import numpy as np from sklearn.datasets import load_sample_images import tensorflo ...
-
[开发技巧]&#183;Python极简实现滑动平均滤波(基于Numpy.convolve)
[开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...
-
【python图像处理】图像的缩放、旋转与翻转
[python图像处理]图像的缩放.旋转与翻转 图像的几何变换,如缩放.旋转和翻转等,在图像处理中扮演着重要的角色,python中的Image类分别提供了这些操作的接口函数,下面进行逐一介绍. 1.图 ...
-
为什么用卷积滤波,而不是非常easy的在频率领域内进行数据的频率处理
卷积.为了更好的"动态"滤波. 问题来了.为什么用卷积滤波.而不是非常easy的在频率领域内进行数据的频率处理? 为了强调我觉得的答案,已经用blog标题给出了.卷积.为了更好的& ...
-
Win8Metro(C#)数字图像处理--2.10图像中值滤波
原文:Win8Metro(C#)数字图像处理--2.10图像中值滤波 [函数名称] 图像中值滤波函数MedianFilterProcess(WriteableBitmap src) [函数代码] ...
-
ubuntu之路——day17.2 RGB图像的卷积、多个filter的输出、单个卷积层的标记方法
和单层图像的卷积类似,只需要对每一个filter构成的三层立方体上的每一个数字与原图像对应位置的数字相乘相加求和即可. 在这个时候可以分别设置filter的R.G.B三层,可以同时检测纵向或横向边缘, ...
-
python 多进程处理图像,充分利用CPU
默认情况下,Python程序使用一个CPU以单个进程运行.不过如果你是在最近几年配置的电脑,通常都是四核处理器,也就是有8个CPU.这就意味着在你苦苦等待Python脚本完成数据处理工作时,你的电脑其 ...
随机推荐
-
[leetcode] 数字游戏
169. Majority Element Given an array of size n, find the majority element. The majority element is t ...
-
listener does not currently know of SID项目部署报数据库错
百度以后是数据库配置错误啊,但是我觉得就是对的呀,也去验证过了. 反正知道问题就是在databaseurl那里,但是原因是什么呢?其他地方部署都是好的呀! 集群问题啊,数据库人员采用集群方式配置数据库 ...
-
vs2015打包winform程序遇到的一系列问题
1.因为打包的时候用的是release版本的东西,所以就先把项目按release编译一下,然后一大波bug,后来修改了生成目标平台为x86,我的解决方案里面加上安装部署项目共5个(ui配置:活动rel ...
-
Linux初学 - 文件夹及文件操作
创建文件夹 mkdir 移动文件夹 mv dir1 dir2 复制文件夹 cp 删除文件夹 rm 创建文件 touch 编辑文件内容 vi /vim 查看文件内容 cat 追加文件内容 echo 复制 ...
-
JSCH实现文件上传的代码实例
package com.vcredit.ddcash.monitor.sendmail; import java.io.File;import java.io.FileInputStream;impo ...
-
关于python文件操作
http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html 总是记不住API.昨晚写的时候用到了这些,但是没记住,于是就索性整理 ...
-
一个完整的菜谱客户端(android源码)(有独立后台)
该源码是自己写的,是一个完整的菜谱类客户端.功能简单比较简单,界面比较丑,自己乱拼接的,只为学习用.功能相对完整,数据来自独立后台,通过http协议获取,全部来自真实数据.代码里面有获取数据的相应ur ...
-
linux下配置Apache基于加密的认证访问
1.首先要确认安装了 mod_ssl模块 我的机器是centos是系统,执行下面命令 yum install -y mod_ssl 2.用openssl工具生成密钥,证书请求文件,证书 在/usr/l ...
-
利用dns解析来实现网站的负载均衡
当网站的访问量大了就会考虑负载均衡,这也是每一个架构师的基本功了,其基本地位就相当于相声里的说学逗唱,活好不好就看这个了 :) 传统的负载均衡思路是单点的,不管你是硬件的还是软件的基本都是这样的原理 ...
-
tarjan算法讲解。
tarjan算法讲解. 全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这个,读完一遍,发现原来tarjan这么简单! tarjan算法,一个关 ...