纯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] < 128:
                dst_pix[w, h] = fg_color
            else:
                dst_pix[w, h] = bg_color
                
    return dst_img

总结:使用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] < 128:
                dst_pix[w, h] = fg_color
            else:
                dst_pix[w, h] = bg_color
                
    return dst_img

def paper_cut(img, threshold, bg_color, fg_color):
    ‘‘‘
    @效果:剪纸
    @param img: instance of Image
    @param threshold: 大小范围[0, 255]
    @param bg_color: 背景色,元组类型,格式:(L)(灰度),(R, G, B),或者(R, G, B, A)
    @param fg_color: 前景色
    @return: instance of Image
    ‘‘‘
    matrix = Img2bin_arr(img, threshold) # 位图转化为二维二值数组
    return bin_arr2Img(matrix, bg_color, fg_color) # 二维二值数组转化为位图

if __name__ == "__main__":
    import sys, os, time

path = os.path.dirname(__file__) + os.sep.join([‘‘, ‘1.jpg‘])
    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])

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

时间: 2024-10-12 00:28:45

纯Python综合图像处理小工具(4)图像的自定义像素处理(剪纸滤镜)的相关文章

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

<背景>  滤镜处理是图像处理中一种非常常见的方法.比如photoshop中的滤镜效果,除了自带的滤镜,还扩展了很多第三方的滤镜效果插件,可以对图像做丰富多样的变换:很多手机app实现了实时滤镜功能,最有名的当属Instagram. 滤镜的原理,常见的是针对数字图像的像素矩阵,使用一个nxn的方形矩阵做滤波器(即kernel,常见的如3x3,5x5等),对该像素矩阵进行遍历,遍历后的图像就是输出图像,如果算法经过优化,遍历的速度足够快,那就是实时滤镜(live filter),可以实时预览图像

纯Python 综合图像处理小工具 (1)

平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visual studio上做很多配置工作.本文充分利用python的便携性和轻量级特点,力图实现一个脚本,到处处理的目标.           1.将待处理图片命名为1.jpg和本文python脚本文件放入同一文件夹:             2.运行python脚本,可以获得分通道图片及相应的直方图.  

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

<背景> 这次分享的脚本是对图像进行增强处理,包含对图像像素的色彩增强.亮度增强.对比度增强.图像尖锐化等增强操作,主要基于PIL包的lambda和ImageEnhance模块. 使用方法和上一贴一样,本文脚本进行了多项功能的集成,一键完成所有处理,图像会即刻显示处理后的效果,并全部保存成特定名称jpeg. 下图是对处理后的图片的二维比较,为了更直观地比较,将处理项(亮度,颜色,对比度,锐度)作为横坐标,处理强度参数作为纵坐标(0,0.25,0.5,0.75,1).当处理强度参数为1的时候,实

Python实现翻译小工具

一.背景 利用Requests模块获取有道词典web页面的post信息,BeautifulSoup来获取需要的内容,通过tkinter模块生成gui界面. 二.代码 fanyi.py代码如下: #!/bin/env python # -*- coding:utf-8 -*- # _author:kaliarch import requests import urllib.parse import time import random import hashlib import json clas

python数字图像处理(五) 图像的退化和复原

import cv2 import numpy as np import matplotlib.pyplot as plt import scipy import scipy.stats %matplotlib inline 读入我们需要的图像 apple = cv2.imread("apple.jpg") apple = cv2.resize(cv2.cvtColor(apple,cv2.COLOR_BGR2RGB),(200,200)) plt.imshow(apple) plt.

python: 实现sha1小工具

File1: sha1.py File2: sha1.bat ------------------ File1: sha1.py import hashlib import os,sys def CalcSha1(filepath): with open(filepath,'rb') as f: sha1obj = hashlib.sha1(); print '>', while(True): data = f.read(20971520) #20M print '.', if (data ==

Python 综合应用小项目一

数据库报错重连机制 利用异常捕获来获取mysql断开的报错,然后再重连 1 import MySQLdb as mysql 2 3 class DB: 4 def __init__(self,host,user,passwd,db_name): 5 self.conn = None 6 self.cursor = None 7 self.host = host 8 self.user = user 9 self.passwd = passwd 10 self.db_name = db_name

Python实现linux/windows通用批量‘命令/上传/下载’小工具

这阵子一直在学python,碰巧最近想把线上服务器环境做一些规范化/统一化,于是便萌生了用python写一个小工具的冲动.就功能方面来说,基本上是在"重复造轮子"吧,但是当我用这小工具完成了30多台服务器从系统层面到应用层面的一些规范化工作之后,觉得效果还不算那么low(高手可忽略这句话~~),这才敢拿出来跟小伙伴们分享一下. (注:笔者所用为python版本为3.5,其他版本未经测试~~) 其实很简单,就"一个脚本"+"server信息文件"实

WordPress小工具开发教程(网站公告)

WordPress小工具开发教程(网站公告) BY TIANQIXIN · 2012 年 12 月 26 日 wordpress主题小工具,可以自由拖动到侧边栏,并在前台实现相应功能!一般自带的小工具功能有限,我们可以通过自己开发小工具来增强wordpress的侧边栏功能.制作wordpress小工具需要用到WP_Widget类,该类位于wp-includes\widgets.php,有兴趣的同学可以打开看看,基本上我们只要扩展这个类就可以开发自己的小工具了.本站以网站公告为例,最终效果图如下: