纯Python综合图像处理小工具(3)10种滤镜算法
<背景>
滤镜处理是图像处理中一种非常常见的方法。比如photoshop中的滤镜效果,除了自带的滤镜,还扩展了很多第三方的滤镜效果插件,可以对图像做丰富多样的变换;很多手机app实现了实时滤镜功能,最有名的当属Instagram。
PIL中主要涉及到卷积滤镜,其原理是针对数字图像的像素矩阵,使用一个nxn的方形矩阵做滤波器(即卷积核kernel,常见的如3x3,5x5等),对该图像像素进行卷积遍历(即截取和卷积核同等大小的像素矩阵进行卷积运算),每一个输出像素都是一定区域像素按一定权重组合计算出的结果(像素不独立,受到邻近像素的影响,邻近像素区域可以调整,选取范围越大,计算量越大,图像处理时间越长),遍历后的图像就是输出图像。如果算法经过优化,遍历的速度足够快,那就是实时滤镜(live filter),可以实时预览图像过滤后的效果。
ImageFilter是Python PIL的滤镜模块,当前版本支持10种加强滤镜,通过这些预定义的滤镜,可以方便的对图片进行一些过滤操作,从而去掉图片中的噪音(部分的消除),这样可以降低图像处理算法的复杂度(如模式识别等),更方便的实现和预览一些算法的效果。
本文脚本包含以下全部滤镜, 实现了10种图像处理滤镜的效果预览和JPEG文件保存。
| ImageFilter.BLUR | 模糊滤镜 | 
| ImageFilter.CONTOUR | 轮廓 | 
| ImageFilter.DETAIL | 细节滤镜 | 
| ImageFilter.EDGE_ENHANCE | 边界加强 | 
| ImageFilter.EDGE_ENHANCE_MORE | 边界加强(阀值更 大) | 
| ImageFilter.EMBOSS | 浮雕滤镜 | 
| ImageFilter.FIND_EDGES | 边界滤镜 | 
| ImageFilter.SMOOTH | 平滑滤镜 | 
| ImageFilter.SMOOTH_MORE | 平滑滤镜(阀值更大) | 
| ImageFilter.SHARPEN | 锐化滤镜 | 
<效果>
原图:

模糊滤镜:

锐度增强滤镜:

细节滤镜:

轮廓滤镜:

边界提取滤镜:

边界增强滤镜:

边界增强滤镜-加强版:

平滑滤镜:

平滑滤镜-加强版:

浮雕滤镜:

<源码分析>
PIL库的滤镜算法可以在Python\Lib\site-packages\PIL路径下找到,如下所示:

在PIL路径下,我们看到了三个同名但后缀不同的文件:ImageFilter.py ,ImageFilter.pyc ,ImageFilter.pyo 。
.py文件:存放的是脚本源代码;
.pyc文件 :是同名的.py编译后的字节码文件,用来供解释器解释执行;
.pyo文件 :是同名的.pyc文件经过优化后的字节码文件,通常体积更小,运行更快。
滤镜算法在ImageFilter.py文件中。
如前文所述,每一个滤镜通常对应着一个滤波器(即kernel),PIL中的kernel均为常见的3x3和5x5方形矩阵,下面是PIL中9种滤镜对应的矩阵:
模糊滤镜:
class BLUR(BuiltinFilter): name = "Blur" filterargs = (5, 5), 16, 0, ( 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1 )
轮廓滤镜:
class CONTOUR(BuiltinFilter): name = "Contour" filterargs = (3, 3), 1, 255, ( -1, -1, -1, -1, 8, -1, -1, -1, -1 )
细节滤镜:
class DETAIL(BuiltinFilter): name = "Detail" filterargs = (3, 3), 6, 0, ( 0, -1, 0, -1, 10, -1, 0, -1, 0 )
边缘增强滤镜:
class EDGE_ENHANCE(BuiltinFilter): name = "Edge-enhance" filterargs = (3, 3), 2, 0, ( -1, -1, -1, -1, 10, -1, -1, -1, -1 )
边缘增强滤镜-增强版:
该增强版和原滤镜仅仅是矩阵2行2列的一个参数大小不同,实际是修改了中心像素的权重。这个数值可以任意修改以自定义边缘增强的幅度。
class EDGE_ENHANCE_MORE(BuiltinFilter): name = "Edge-enhance More" filterargs = (3, 3), 1, 0, ( -1, -1, -1, -1, 9, -1, -1, -1, -1 )
浮雕滤镜
class EMBOSS(BuiltinFilter): name = "Emboss" filterargs = (3, 3), 1, 128, ( -1, 0, 0, 0, 1, 0, 0, 0, 0 )
边缘提取滤镜:
class FIND_EDGES(BuiltinFilter): name = "Find Edges" filterargs = (3, 3), 1, 0, ( -1, -1, -1, -1, 8, -1, -1, -1, -1 )
平滑滤镜:
class SMOOTH(BuiltinFilter): name = "Smooth" filterargs = (3, 3), 13, 0, ( 1, 1, 1, 1, 5, 1, 1, 1, 1 )
平滑滤镜-加强版:
平滑滤镜的加强是增加了滤镜窗口的尺寸,有3x3扩展到5x5, 这样每一个新像素的产生会包含25个周围原始像素的加权贡献(离得越近,贡献越大),这样的结果会更加平滑自然,代价是处理速度会明显的变慢。
class SMOOTH_MORE(BuiltinFilter): name = "Smooth More" filterargs = (5, 5), 100, 0, ( 1, 1, 1, 1, 1, 1, 5, 5, 5, 1, 1, 5, 44, 5, 1, 1, 5, 5, 5, 1, 1, 1, 1, 1, 1 )
锐化滤镜:
class SHARPEN(BuiltinFilter): name = "Sharpen" filterargs = (3, 3), 16, 0, ( -2, -2, -2, -2, 32, -2, -2, -2, -2 )
此外,这些滤镜不仅可以独立使用,还可以自由组合,比如边缘提取+平滑滤镜,可以得到更加干净的边缘提取图像等等,此处不一一列举。
左图为原始边界提取图,右侧为平滑后的边界图。

<脚本源码>
#start
# -*- coding: cp936 -*-
import Image,ImageDraw
import ImageFilter,random,sys
img = Image.open("1.jpg") ##图像处理##
#转换为RGB图像
img = img.convert("RGB") #经过PIL自带filter处理
imgfilted_b = img.filter(ImageFilter.BLUR)
imgfilted_c = img.filter(ImageFilter.CONTOUR)
imgfilted_ee = img.filter(ImageFilter.EDGE_ENHANCE)
imgfilted_ee_m = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
imgfilted_em = img.filter(ImageFilter.EMBOSS)
imgfilted_fe = img.filter(ImageFilter.FIND_EDGES)
imgfilted_sm = img.filter(ImageFilter.SMOOTH)
imgfilted_sm_m = img.filter(ImageFilter.SMOOTH_MORE)
imgfilted_sh = img.filter(ImageFilter.SHARPEN)
imgfilted_d = img.filter(ImageFilter.DETAIL) ##组合使用filter
group_imgfilted = img.filter(ImageFilter.CONTOUR)
group_imgfilted = group_imgfilted.filter(ImageFilter.SMOOTH_MORE) ##图像保存##
imgfilted_b.save("1b.jpg")
imgfilted_c.save("1c.jpg")
imgfilted_ee.save("1ee.jpg")
imgfilted_ee_m.save("1eem.jpg")
imgfilted_em.save("1em.jpg")
imgfilted_fe.save("1fe.jpg")
imgfilted_sm.save("1sm.jpg")
imgfilted_sm_m.save("1smm.jpg")
imgfilted_sh.save("1sh.jpg")
imgfilted_d.save("1d.jpg")
group_imgfilted.save("1group.jpg") ##图像显示##
imgfilted_b.show()
imgfilted_c.show()
imgfilted_ee.show()
imgfilted_ee_m.show()
imgfilted_em.show()
imgfilted_fe.show()
imgfilted_sm.show()
imgfilted_sm_m.show()
imgfilted_sh.show()
imgfilted_d.show()
group_imgfilted.show()
#end
纯Python综合图像处理小工具(3)10种滤镜算法的更多相关文章
- 纯Python综合图像处理小工具(4)自定义像素级处理(剪纸滤镜)
		上一节介绍了python PIL库自带的10种滤镜处理,现成的库函数虽然用起来方便,但是对于图像处理的各种实际需求,还需要开发者开发自定义的滤镜算法.本文将给大家介绍如何使用PIL对图像进行自定义 ... 
- 纯Python综合图像处理小工具(1)分通道直方图
		平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visua ... 
- 纯Python综合图像处理小工具(2)图像增强
		<背景> 这次分享的脚本是对图像进行增强处理,包含对图像像素的色彩增强.亮度增强.对比度增强.图像尖锐化等增强操作,主要基于PIL包的lambda和ImageEnhance模块. 使用方法 ... 
- Python趣味实用小工具
		代码地址如下:http://www.demodashi.com/demo/12918.html python 趣味实用小工具 概述 用python实现的三个趣味实用小工具: 图片转Execl工具 , ... 
- Python+Tkinter 密保小工具
		上图 代码 核心 编解码方面 Tkinter界面更新 总结 昨天被一同学告知,网上的一个QQ密码库中有我的一条记录,当时我就震惊了,赶紧换了密码.当然了,这件事也给了我一个警示,那就是定期的更换自己的 ... 
- python提效小工具-统计xmind用例数量
		问题:做测试的朋友们经常会用到xmind这个工具来梳理测试点或写测试用例,但是xmind8没有自带的统计测试用例,其他版本的xmind有些自带节点数量统计功能,但也也不会累计最终的数量,导致统计测试工 ... 
- python  tkinter模块小工具界面
		代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ... 
- 几个可以提高工作效率的Python内置小工具
		在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ... 
- 10 种机器学习算法的要点(附 Python 和 R 代码)
		本文由 伯乐在线 - Agatha 翻译,唐尤华 校稿.未经许可,禁止转载!英文出处:SUNIL RAY.欢迎加入翻译组. 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关 ... 
随机推荐
- 脉冲神经网络Spiking neural network
			(原文地址:维基百科) 简单介绍: 脉冲神经网络Spiking neuralnetworks (SNNs)是第三代神经网络模型,其模拟神经元更加接近实际,除此之外,把时间信息的影响也考虑当中.思路是这 ... 
- nexus私服linux搭建问题
			一.最近搭建nexus私服,从官网下载下来总是报503服务器无效,很是无奈,最后在网上找到一个可以用的 收藏起来,这里给大家共享一下 下载地址:http://pan.baidu.com/s/1kT3U ... 
- android 当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出
			当目录路径从n层按back键退回到n-19层的时候,file manager自己主动退出,比方在63层按back 键退回到44层的时候,file manager自己主动退出. 1.FileMana ... 
- java抽象类和接口的区别(转载)
			1.Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用. 如果向一个抽象类里加入 ... 
- Android 通过网络打开自己的APP(scheme)
			通过使用手机的浏览器(内部.第三方能够)访问网页,点击一个链接,开始实施自己的应用程序,和传输数据. 第一Mainifest面对文件启动Activity添加过滤器. <activity andr ... 
- 请确保在编译时已将“AjaxControlToolkit.Properties.Resources.NET4.resources”正确嵌入或链接到程序集“AjaxControlToolkit”
			原文:请确保在编译时已将"AjaxControlToolkit.Properties.Resources.NET4.resources"正确嵌入或链接到程序集"AjaxC ... 
- SQL Server 2008 R2中,变表的右键弹出菜单中的“选择前1000行”为“选择所有行”
			原文:SQL Server 2008 R2中,变表的右键弹出菜单中的"选择前1000行"为"选择所有行" 从SQL Server 2008开始,微软为了提高查询 ... 
- 在windows server2003下安装Redmine
			原文:在windows server2003下安装Redmine 参考文献:Windows下使用_Ruby1.9.3安装RedMine2.2.3 参考资料:http://www.redmine.org ... 
- 编写SQL的辅助工具
			原文:编写SQL的辅助工具 今天在同事的帮助下,下载了一个工具:ApexSQL edit,可能是我孤陋寡闻,不知道还有这样的好工具,它可以在我键入SQL时,帮助我提示表的名称和列名称.还可以帮助我格式 ... 
- mysql支持的数据类型及其测试
			原文:mysql支持的数据类型及其测试 1.基础知识 1.1如何来查看mysql的帮助手册 ?int Help float; 1.2创建表的规则 CREATE TABLE [IF NOT EXISTS ... 
