上一节介绍了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)自定义像素级处理(剪纸滤镜)的更多相关文章

  1. 纯Python综合图像处理小工具(3)10种滤镜算法

    <背景>  滤镜处理是图像处理中一种非常常见的方法.比如photoshop中的滤镜效果,除了自带的滤镜,还扩展了很多第三方的滤镜效果插件,可以对图像做丰富多样的变换:很多手机app实现了实 ...

  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内置小工具

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

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

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

  8. python tkinter模块小工具界面

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

  9. python: 实现sha1小工具

    File1: sha1.py File2: sha1.bat ------------------ File1: sha1.py import hashlib import os,sys def Ca ...

随机推荐

  1. Android checkCallingPermission()方法返回值问题

    Android开发检查权限时,发现调用checkCallingPermission()总是返回值-1,而Binder.getCallingPid() == Process.myPid()又总是返回tr ...

  2. 步步详解近期大火的density_peak超赞聚类

    近期忙着在公司捣腾基于SOA的应急框架,还是前两周才在微博上看见了density_peak,被圈内好些人转载. 由于这个算法的名字起的实在惹眼,都没好意思怎么把这个算法名字翻译成中文,当然更惹眼的是, ...

  3. CentOS采用grub进 single状态

    当系统文件错误,有可能无法进入系统.或者您忘记了原来的系统password. 用这种方法可以,进single状态,编辑系统启动文件或更改的错误password. 1.重新启动系统. 2.按" ...

  4. .net 职责链来实现 插件模式

    .net 职责链来实现 插件模式 插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能 ...

  5. C语言宏的高级应用

    原文:C语言宏的高级应用 关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号.比如 ...

  6. ios背景更新和下载

    ios背景更新和下载 by 吴雪莹 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NS ...

  7. sql点滴40—mysql乱码问题总结

    原文:sql点滴40-mysql乱码问题总结 本文将为大家讲解如何处理Java连接过程中的MySQL中文乱码问题.一般MySQL中文乱码问题都是与字符集有关,这里作者的经历也大致差不多. MySQL默 ...

  8. request.getparameter和 request.getattribute的差别

    request.getAttribute():是request时设置的变量的值,用request.setAttribute("name","您自己的值");来设 ...

  9. 在VirtualBox下安装CentOS教程(截图版)

    http://blog.csdn.net/kobe_lzq/article/details/7894718 使用的软件: VirtualBox 4.1.2 CentOS 5.6 x86_64  刻录的 ...

  10. IIS 5.x/6.0/7.0 和 ASP.NET

    原文:IIS 5.x/6.0/7.0 和 ASP.NET 本文主要介绍 3 个主要的 IIS 版本各自对 Web 请求的不同处理方式. 本文内容 IIS 5.x 和 ASP.NET IIS 6.0 和 ...