纯Python综合图像处理小工具(4)自定义像素级处理(剪纸滤镜)
上一节介绍了python PIL库自带的10种滤镜处理,现成的库函数虽然用起来方便,但是对于图像处理的各种实际需求,还需要开发者开发自定义的滤镜算法。本文将给大家介绍如何使用PIL对图像进行自定义的像素级操作。
本文以剪纸风格图像处理作为例子:(算法借鉴了残阳似血的博客http://qinxuye.me/,特此鸣谢。)
原图:
处理后:
1.首先将处理参数预先设定好。设定阈值threshold,该阈值会用来区分作为目标颜色的前景色和将要被去除掉的的背景色的分界线。同时设置处理后前景色和后景色的颜色,用以呈现最终的分割效果。
threshold = 150 bg_color = (255, 255, 255, 0) fg_color = (255, 0, 0, 255) if len(sys.argv) >= 2: path = sys.argv[1] if len(sys.argv) == 3: threshold = int(sys.argv[2]) if len(sys.argv) == 5: bg_color = tuple(sys.argv[3]) fg_color = tuple(sys.argv[4])
在这一步中,如果阈值threshold设定不同数值,图片会呈现不同的二值分界效果,如下图:

如果阈值过小,则图像中的斑马,会有部分颜色较浅的前景色,即灰色斑纹被误判成背景色而被滤除掉,从而造成前景图像轮廓的残缺。
如果阈值过大,则与上述情况相反,会有背景色被误判成前景色,造成斑纹的边缘膨胀,视觉上看也类似膨胀的效果(虽然原理完全不同)。
所以,选择一个合适的阈值,对图像的分割效果至关重要。而这一点,又是随着图像不同而变化的,阈值要适应图像内容。
对于这个问题,可以尝试使用动态阈值,结合图像统计来实现自匹配,本文未涉及,有兴趣的童鞋可以自行尝试。
2.将图片转换成可以做像素操作的二值像素集合,然后使用设定好的阈值threshold进行前景后景分割:
def Img2bin_arr(img, threshold):
'''
@将位图流转化为二维二值数组
@param img: instance of Image
@param threshold: 大小范围[0, 255]
'''
threshold = max(0, threshold)
threshold = min(255, threshold)
if img.mode != 'L':
img = img.convert('L')
width, height = img.size
pix = img.load()
get_val = lambda p: 255 if p >= threshold else 0
return [[get_val(pix[w, h]) for w in xrange(width)] for h in xrange(height)]
3.将分割好的像素使用预先设定的颜色上色,然后将像素集合重新封装成图片格式,然后返回这个图片,用于保存或显示。
def bin_arr2Img(matrix, bg_color, fg_color):
'''
@将二维二值数组转化为位图流
@param img: instance of Image
@param bg_color: 背景色,元组类型,格式:(L)(灰度),(R, G, B),或者(R, G, B, A)
@param fg_color: 前景色
'''
def ensure_color(color):
if len(color) == 1:
return (color, color, color, 255)
elif len(color) == 3:
color = list(color)
color.append(255)
return tuple(color)
elif len(color) == 4:
return color
else:
raise ValueError, 'len(color) cannot be %d' % len(color)
bg_color = ensure_color(bg_color)
fg_color = ensure_color(fg_color)
height, width = len(matrix), len(matrix[0])
dst_img = Image.new("RGBA", (width, height))
dst_pix = dst_img.load()
for w in xrange(width):
for h in xrange(height):
if matrix[h][w]
总结:使用python进行像素级图像处理,同其他平台的像素处理类似,整个过程非常清晰,大体上都是三步,拆包-处理-封包。鉴于python的处理速度实在是不敢恭维,所以它是一个很好的算法效果验证平台。
完整代码分享如下:
#start
# -*- coding: cp936 -*-
import Image
img = Image.open("1.jpg")
def Img2bin_arr(img, threshold):
'''
@将位图流转化为二维二值数组
@param img: instance of Image
@param threshold: 大小范围[0, 255]
'''
threshold = max(0, threshold)
threshold = min(255, threshold)
if img.mode != 'L':
img = img.convert('L')
width, height = img.size
pix = img.load()
get_val = lambda p: 255 if p >= threshold else 0
return [[get_val(pix[w, h]) for w in xrange(width)] for h in xrange(height)]
def bin_arr2Img(matrix, bg_color, fg_color):
'''
@将二维二值数组转化为位图流
@param img: instance of Image
@param bg_color: 背景色,元组类型,格式:(L)(灰度),(R, G, B),或者(R, G, B, A)
@param fg_color: 前景色
'''
def ensure_color(color):
if len(color) == 1:
return (color, color, color, 255)
elif len(color) == 3:
color = list(color)
color.append(255)
return tuple(color)
elif len(color) == 4:
return color
else:
raise ValueError, 'len(color) cannot be %d' % len(color)
bg_color = ensure_color(bg_color)
fg_color = ensure_color(fg_color)
height, width = len(matrix), len(matrix[0])
dst_img = Image.new("RGBA", (width, height))
dst_pix = dst_img.load()
for w in xrange(width):
for h in xrange(height):
if matrix[h][w] = 2:
path = sys.argv[1]
if len(sys.argv) == 3:
threshold = int(sys.argv[2])
if len(sys.argv) == 5:
bg_color = tuple(sys.argv[3])
fg_color = tuple(sys.argv[4])
start = time.time()
img = Image.open(path)
img = paper_cut(img, threshold, bg_color, fg_color)
img.save(os.path.splitext(path)[0]+'.papercut_'+str(threshold)+'.png', 'PNG')
end = time.time()
print 'It all spends %f seconds time' % (end-start)
#end
纯Python综合图像处理小工具(4)自定义像素级处理(剪纸滤镜)的更多相关文章
- 纯Python综合图像处理小工具(3)10种滤镜算法
<背景> 滤镜处理是图像处理中一种非常常见的方法.比如photoshop中的滤镜效果,除了自带的滤镜,还扩展了很多第三方的滤镜效果插件,可以对图像做丰富多样的变换:很多手机app实现了实 ...
- 纯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内置小工具
在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...
- python提效小工具-统计xmind用例数量
问题:做测试的朋友们经常会用到xmind这个工具来梳理测试点或写测试用例,但是xmind8没有自带的统计测试用例,其他版本的xmind有些自带节点数量统计功能,但也也不会累计最终的数量,导致统计测试工 ...
- python tkinter模块小工具界面
代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ...
- python: 实现sha1小工具
File1: sha1.py File2: sha1.bat ------------------ File1: sha1.py import hashlib import os,sys def Ca ...
随机推荐
- 苹果新的编程语言 Swift 语言进阶(十二)--选项链
选项链是使用选项来查询和调用其属性.方法或下标的一个过程,假设选项包括一个值,则属性.方法.下标的查询和调用成功,否则,调用返回nil. 选项链能用在不论什么类型的选项来检查对其一个属性.方法.下标的 ...
- NET Framework 4.5 五个新特性
.NET Framework 4.5 五个新特性 Framework 4.5 已经开发了几个项目了,想去研究一下VS 2015 里面的跨平台..不过好像4.5内核新特性还没搞明白呢还是先看看4.5内核 ...
- JavaScript插件化开发
大熊君JavaScript插件化开发 一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得昨天的那篇文章吗------这个系列的开篇(第一季).主要讲述了以“jQuery的方式如何开发插件”, 那 ...
- Thrift实践
Thrift实践:(一)安装 -- 未完待续 1. 新建一个目录,C:\test\thrift-test,里面建2个子文件夹,client-node和sever-csharp,然后把Thrift官 ...
- IE中的事件对象
IE中的事件对象 1)type属性 用于获取事件类型 2)srcElement属性 用于获取事件的目标 3)cancelBubble属性 用于阻止事件冒泡 设置为true表示阻止事件冒泡 设置为fa ...
- Apache启动失败,请检查相关配置。MySQL5.1已启动成功
解决办法 一: 把左下角的SSL钩上了,如果你没有用证书,就把那个去掉,有的朋友去掉就可以了.也可能再装了证书钩上SSL也可以用了. 二: 看了说的把SSL勾掉的办法,也解决不了.后来就去查卡巴,也没 ...
- Cocos2d-x 3.0final 终结者系列教程12-Vector&map&value
北京时间昨天下午,温40度.中午12:16我来到了篮球场点.思维1分钟决定开站 转球: 我和另一个3队友半开始, 我手中的球的那一刻我突然火爆球不稳,突然问,淡淡的味道橡胶和烧烤的味道混合. 个腾空跳 ...
- PHP jpgraph的一点小提示(附安装方法)
PHP中的GD库本身是一套很强大的绘图库了,绘制的图像基本可以满足日常要求,但强大规强大,还是不够方便哈,因为强大方便的基于PHP的GD库的jpgraph也就诞生啦! PHP默认是不启用GD库的,因为 ...
- Spring IOC之Classpath扫描和管理的组件
在前面的大部分例子我们使用XML去指明配置数据去定义在Spring容器中的每一个BeanDefinition.上一节我们展示了如何在 代码层注解的方式来提供大量的配置信息.即使在这些例子中,但是,基础 ...
- 跟我一起写Makefile-陈皓
跟我一起写Makefile GNU make