<背景> 

滤镜处理是图像处理中一种非常常见的方法。比如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种滤镜对应的矩阵:

模糊滤镜:

  1. class BLUR(BuiltinFilter):
  2.  
  3.     name = "Blur"
  4.  
  5.     filterargs = (5, 5), 16, 0, (
  6.  
  7.         1,  1,  1,  1,  1,
  8.  
  9.         1,  0,  0,  0,  1,
  10.  
  11.         1,  0,  0,  0,  1,
  12.  
  13.         1,  0,  0,  0,  1,
  14.  
  15.         1,  1,  1,  1,  1
  16.  
  17.         )
        

轮廓滤镜:

  1. class CONTOUR(BuiltinFilter):
  2.  
  3.     name = "Contour"
  4.  
  5.     filterargs = (3, 3), 1, 255, (
  6.  
  7.         -1, -1, -1,
  8.  
  9.         -1,  8, -1,
  10.  
  11.         -1, -1, -1
  12.  
  13.         )

细节滤镜:

  1. class DETAIL(BuiltinFilter):
  2.  
  3.     name = "Detail"
  4.  
  5.     filterargs = (3, 3), 6, 0, (
  6.  
  7.         0, -1,  0,
  8.  
  9.         -1, 10, -1,
  10.  
  11.         0, -1,  0
  12.  
  13.         )

边缘增强滤镜:

  1. class EDGE_ENHANCE(BuiltinFilter):
  2.  
  3.     name = "Edge-enhance"
  4.  
  5.     filterargs = (3, 3), 2, 0, (
  6.  
  7.         -1, -1, -1,
  8.  
  9.         -1, 10, -1,
  10.  
  11.         -1, -1, -1
  12.  
  13.         )

边缘增强滤镜-增强版:

该增强版和原滤镜仅仅是矩阵2行2列的一个参数大小不同,实际是修改了中心像素的权重。这个数值可以任意修改以自定义边缘增强的幅度。

  1. class EDGE_ENHANCE_MORE(BuiltinFilter):
  2.  
  3.     name = "Edge-enhance More"
  4.  
  5.     filterargs = (3, 3), 1, 0, (
  6.  
  7.         -1, -1, -1,
  8.  
  9.         -1,  9, -1,
  10.  
  11.         -1, -1, -1
  12.  
  13.         )

浮雕滤镜

  1. class EMBOSS(BuiltinFilter):
  2.  
  3.     name = "Emboss"
  4.  
  5.     filterargs = (3, 3), 1, 128, (
  6.  
  7.         -1,  0,  0,
  8.  
  9.         0,  1,  0,
  10.  
  11.         0,  0,  0
  12.  
  13.         )

边缘提取滤镜:

  1. class FIND_EDGES(BuiltinFilter):
  2.  
  3.     name = "Find Edges"
  4.  
  5.     filterargs = (3, 3), 1, 0, (
  6.  
  7.         -1, -1, -1,
  8.  
  9.         -1,  8, -1,
  10.  
  11.         -1, -1, -1
  12.  
  13.         )

平滑滤镜:

  1. class SMOOTH(BuiltinFilter):
  2.  
  3.     name = "Smooth"
  4.  
  5.     filterargs = (3, 3), 13, 0, (
  6.  
  7.         1,  1,  1,
  8.  
  9.         1,  5,  1,
  10.  
  11.         1,  1,  1
  12.  
  13.         ) 

平滑滤镜-加强版:

平滑滤镜的加强是增加了滤镜窗口的尺寸,有3x3扩展到5x5, 这样每一个新像素的产生会包含25个周围原始像素的加权贡献(离得越近,贡献越大),这样的结果会更加平滑自然,代价是处理速度会明显的变慢。

  1. class SMOOTH_MORE(BuiltinFilter):
  2.  
  3.     name = "Smooth More"
  4.  
  5.     filterargs = (5, 5), 100, 0, (
  6.  
  7.         1,  1,  1,  1,  1,
  8.  
  9.         1,  5,  5,  5,  1,
  10.  
  11.         1,  5, 44,  5,  1,
  12.  
  13.         1,  5,  5,  5,  1,
  14.  
  15.         1,  1,  1,  1,  1
  16.  
  17.         )

锐化滤镜:

  1. class SHARPEN(BuiltinFilter):
  2.  
  3.     name = "Sharpen"
  4.  
  5.     filterargs = (3, 3), 16, 0, (
  6.  
  7.         -2, -2, -2,
  8.  
  9.         -2, 32, -2,
  10.  
  11.         -2, -2, -2
  12.  
  13.         )

此外,这些滤镜不仅可以独立使用,还可以自由组合,比如边缘提取+平滑滤镜,可以得到更加干净的边缘提取图像等等,此处不一一列举。

左图为原始边界提取图,右侧为平滑后的边界图。

<脚本源码> 

  1. #start
  2. # -*- coding: cp936 -*-
  3. import Image,ImageDraw
  4. import ImageFilter,random,sys
  5. img = Image.open("1.jpg")
  6.  
  7. ##图像处理##
  8. #转换为RGB图像
  9. img = img.convert("RGB")              
  10.  
  11. #经过PIL自带filter处理
  12. imgfilted_b = img.filter(ImageFilter.BLUR)
  13. imgfilted_c = img.filter(ImageFilter.CONTOUR)
  14. imgfilted_ee = img.filter(ImageFilter.EDGE_ENHANCE)
  15. imgfilted_ee_m = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
  16. imgfilted_em = img.filter(ImageFilter.EMBOSS)                    
  17. imgfilted_fe = img.filter(ImageFilter.FIND_EDGES)                                                
  18. imgfilted_sm = img.filter(ImageFilter.SMOOTH)
  19. imgfilted_sm_m = img.filter(ImageFilter.SMOOTH_MORE)
  20. imgfilted_sh = img.filter(ImageFilter.SHARPEN)
  21. imgfilted_d = img.filter(ImageFilter.DETAIL)
  22.  
  23. ##组合使用filter
  24. group_imgfilted = img.filter(ImageFilter.CONTOUR)
  25. group_imgfilted = group_imgfilted.filter(ImageFilter.SMOOTH_MORE)
  26.  
  27. ##图像保存##
  28. imgfilted_b.save("1b.jpg")
  29. imgfilted_c.save("1c.jpg")
  30. imgfilted_ee.save("1ee.jpg")
  31. imgfilted_ee_m.save("1eem.jpg")
  32. imgfilted_em.save("1em.jpg")
  33. imgfilted_fe.save("1fe.jpg")                                
  34. imgfilted_sm.save("1sm.jpg")
  35. imgfilted_sm_m.save("1smm.jpg")
  36. imgfilted_sh.save("1sh.jpg")
  37. imgfilted_d.save("1d.jpg")
  38. group_imgfilted.save("1group.jpg")
  39.  
  40. ##图像显示##
  41. imgfilted_b.show()
  42. imgfilted_c.show()
  43. imgfilted_ee.show()
  44. imgfilted_ee_m.show()
  45. imgfilted_em.show()
  46. imgfilted_fe.show()                                
  47. imgfilted_sm.show()
  48. imgfilted_sm_m.show()
  49. imgfilted_sh.show()
  50. imgfilted_d.show()
  51. group_imgfilted.show()
  52. #end

纯Python综合图像处理小工具(3)10种滤镜算法的更多相关文章

  1. 纯Python综合图像处理小工具(4)自定义像素级处理(剪纸滤镜)

      上一节介绍了python PIL库自带的10种滤镜处理,现成的库函数虽然用起来方便,但是对于图像处理的各种实际需求,还需要开发者开发自定义的滤镜算法.本文将给大家介绍如何使用PIL对图像进行自定义 ...

  2. 纯Python综合图像处理小工具(1)分通道直方图

    平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visua ...

  3. 纯Python综合图像处理小工具(2)图像增强

    <背景> 这次分享的脚本是对图像进行增强处理,包含对图像像素的色彩增强.亮度增强.对比度增强.图像尖锐化等增强操作,主要基于PIL包的lambda和ImageEnhance模块. 使用方法 ...

  4. Python趣味实用小工具

    代码地址如下:http://www.demodashi.com/demo/12918.html python 趣味实用小工具 概述 用python实现的三个趣味实用小工具: 图片转Execl工具 , ...

  5. Python+Tkinter 密保小工具

    上图 代码 核心 编解码方面 Tkinter界面更新 总结 昨天被一同学告知,网上的一个QQ密码库中有我的一条记录,当时我就震惊了,赶紧换了密码.当然了,这件事也给了我一个警示,那就是定期的更换自己的 ...

  6. python提效小工具-统计xmind用例数量

    问题:做测试的朋友们经常会用到xmind这个工具来梳理测试点或写测试用例,但是xmind8没有自带的统计测试用例,其他版本的xmind有些自带节点数量统计功能,但也也不会累计最终的数量,导致统计测试工 ...

  7. python tkinter模块小工具界面

    代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ...

  8. 几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

  9. 10 种机器学习算法的要点(附 Python 和 R 代码)

    本文由 伯乐在线 - Agatha 翻译,唐尤华 校稿.未经许可,禁止转载!英文出处:SUNIL RAY.欢迎加入翻译组. 前言 谷歌董事长施密特曾说过:虽然谷歌的无人驾驶汽车和机器人受到了许多媒体关 ...

随机推荐

  1. CSS3+HTML5特效2 - 翻转效果

    先看效果,鼠标移上去看看. back front 1. 本实例需要以下元素 a. 容器BOX b. 默认显示元素FRONT c. 翻转显示元素BACK 2. 容器BOX的Height为200px,Wi ...

  2. 自动引用计数(ARC)

    1.1什么是自动引用技术 顾名思义,自动引用计数(ARC, Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术.以下摘自苹果官方说明: 在Objectiv ...

  3. 20款最好的免费的IDES和编辑器

    程序员编程利器:20款最好的免费的IDES和编辑器 Posted on 2015-02-17 21:52 尛鱼 阅读(170) 评论(1) 编辑 收藏 程序员编程利器:20款最好的免费的IDEs和编辑 ...

  4. 用bat启动sqlserver服务

    声明下这个脚本不是我写的,忘了是从哪看到的了,在此分享给大家,因为在我的理解中技术就是用来分享的,,希望原创作者看到了不要介意. 1.创建个文本,将后缀名改成.bat 2.将下边语句粘贴进去,然后保存 ...

  5. UIAutomator源码分析之启动和运行

    通过上一篇<Android4.3引入的UiAutomation新框架官方简介>我们可以看到UiAutomator其实就是使用了UiAutomation这个新框架,通过调用Accessibi ...

  6. POJ 1947 树DP获得冠军

    特定N点,N-1的关系.建立了一棵树,问至少减去几个边缘节点可以被作为得到P树.树典型DP称号 dp[cur][j] :记录cur节点,为了得到一个j除去该子树的节点的边的最小数目 对当前树的每个子树 ...

  7. OpenGL+VS2013+WIN7(64)组态

    1.下载windows在下面glut安装文件:http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip 2. 拆开发现五个文件 ...

  8. ThinkPad E431/E531 ubuntu 14.04 安装无线网卡驱动

    ubuntu系统装好之后无限网卡驱动并不能用.须要自己下载无线网卡驱动.以下是最简单的方法: sudo apt-get install linux-headers-generic build-esse ...

  9. 软件project(六)——需求分析

           需求分析是软件开发期的第一个阶段,是关系到软件开发成败的关键步骤.需求分析的任务就是明白系统必须完毕那些工作,以下是对需求分析这一章做的简要总结. 导图: 解释说明:        我将 ...

  10. APUE学习笔记(2):lseek()练习与文件洞

    对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...