2017-03-16 18:36:38 u013177568 阅读数 342
  • Python全栈】第六周 Django框架

    本周课程主要讲解Python的Web框架Django,具体有Django框架的安装、快速入门、URL路由配置、Model模型、View视图、Template模板、以及常用的web工具和其他核心功能。通过本周学习让学员可以掌握:Django框架的快速搭建、使用网站Admin后台管理、数据库表信息的增、删、改、查、验证码的使用、文件上传,图片处理、数据分页和富文本编辑器的使用等等技能。

    665 人正在学习 去看看 CSDN就业班

1. 简介。

    图像处理是一门应用非常广的技术,而拥有非常丰富第三方扩展库的 Python 当然不会错过这一门盛宴。PIL (Python Imaging Library)是 Python 中最常用的图像处理库,目前版本为 1.1.7,我们可以 在这里 下载学习和查找资料。

    Image 类是 PIL 库中一个非常重要的类,通过这个类来创建实例可以有直接载入图像文件,读取处理过的图像和通过抓取的方法得到的图像这三种方法。

2. 使用。

    导入 Image 模块。然后通过 Image 类中的 open 方法即可载入一个图像文件。如果载入文件失败,则会引起一个 IOError ;若无返回错误,则 open 函数返回一个 Image 对象。现在,我们可以通过一些对象属性来检查文件内容,即:

1 >>> import Image 2  >>> im = Image.open("j.jpg") 3  >>> print im.format, im.size, im.mode 4 JPEG (440, 330) RGB

    这里有三个属性,我们逐一了解。

        format : 识别图像的源格式,如果该文件不是从文件中读取的,则被置为 None 值。

        size : 返回的一个元组,有两个元素,其值为象素意义上的宽和高。

        mode : RGB(true color image),此外还有,L(luminance),CMTK(pre-press image)。

    现在,我们可以使用一些在 Image 类中定义的方法来操作已读取的图像实例。比如,显示最新载入的图像:

1 >>>im.show() 2  >>>

    输出原图:

3. 函数概貌。

3.1    Reading and Writing Images : open( infilename ) , save( outfilename )

3.2    Cutting and Pasting and Merging Images :

        crop() : 从图像中提取出某个矩形大小的图像。它接收一个四元素的元组作为参数,各元素为(left, upper, right, lower),坐标系统的原点(0, 0)是左上角。

        paste() : 

        merge() :

复制代码
1 >>> box = (100, 100, 200, 200) 2  >>> region = im.crop(box) 3  >>> region.show() 4  >>> region = region.transpose(Image.ROTATE_180) 5  >>> region.show() 6  >>> im.paste(region, box) 7  >>> im.show()
复制代码

    其效果图为:

    旋转一幅图片:

复制代码
 1 def roll(image, delta):  2  "Roll an image sideways"  3   4  xsize, ysize = image.size  5   6  delta = delta % xsize  7  if delta == 0: return image  8   9  part1 = image.crop((0, 0, delta, ysize)) 10  part2 = image.crop((delta, 0, xsize, ysize)) 11  image.paste(part2, (0, 0, xsize-delta, ysize)) 12  image.paste(part1, (xsize-delta, 0, xsize, ysize)) 13  14  return image
复制代码
3.3    几何变换。

3.3.1    简单的几何变换。

复制代码
1 >>>out = im.resize((128, 128)) # 2  >>>out = im.rotate(45)  #逆时针旋转 45 度角。 3  >>>out = im.transpose(Image.FLIP_LEFT_RIGHT) #左右对换。 4  >>>out = im.transpose(Image.FLIP_TOP_BOTTOM) #上下对换。 5  >>>out = im.transpose(Image.ROTATE_90) #旋转 90 度角。 6  >>>out = im.transpose(Image.ROTATE_180) #旋转 180 度角。 7 >>>out = im.transpose(Image.ROTATE_270) #旋转 270 度角。
复制代码

    各个调整之后的图像为:

    图片1:

    图片2:

    图片3:

    图片4:

3.3.2    色彩空间变换。

    convert() : 该函数可以用来将图像转换为不同色彩模式。

3.3.3    图像增强。

    Filters : 在 ImageFilter 模块中可以使用 filter 函数来使用模块中一系列预定义的增强滤镜。


1 >>> import ImageFilter 2 >>> imfilter = im.filter(ImageFilter.DETAIL) 3 >>> imfilter.show()
3.4    序列图像。


    即我们常见到的动态图,最常见的后缀为 .gif ,另外还有 FLI / FLC 。PIL 库对这种动画格式图也提供了一些基本的支持。当我们打开这类图像文件时,PIL 自动载入图像的第一帧。我们可以使用 seek 和 tell 方法在各帧之间移动。


复制代码
1 import Image 2 im.seek(1) # skip to the second frame 3  4 try: 5  while 1: 6  im.seek( im.tell() + 1) 7  # do something to im 8 except EOFError: 9  pass
复制代码


3.5    更多关于图像文件的读取。

    最基本的方式:im = Image.open("filename")

    类文件读取:fp = open("filename", "rb"); im = Image.open(fp)

    字符串数据读取:import StringIO; im = Image.open(StringIO.StringIO(buffer))

    从归档文件读取:import TarIO; fp = TarIo.TarIO("Image.tar", "Image/test/lena.ppm"); im = Image.open(fp)

基本的 PIL 目前就练习到这里。其他函数的功能可点击 这里 进一步阅读。





关于PIL库的一些概念


pil能处理的图片类型
pil可以处理光栅图片(像素数据组成的的块)。

通道
一个图片可以包含一到多个数据通道,如果这些通道具有相同的维数和深度,Pil允许将这些通道进行叠加

模式

1  1位像素,黑和白,存成8位的像素
L  8位像素,黑白
P  8位像素,使用调色板映射到任何其他模式
RGB  3×8位像素,真彩
RGBA  4×8位像素,真彩+透明通道
CMYK  4×8位像素,颜色隔离
YCbCr  3×8位像素,彩色视频格式
I  32位整型像素
F  32位浮点型像素




尺寸
通过图片对象的size属性可以得到图片的尺寸,结果这是一个二元组,包含水平和垂直方向上的像素数。

坐标
Pil采取左上角为(0,0)的坐标系统

调色板
mode("P")为每个像素定义具体的颜色值

图片信息
可以通过info属性读取一张图片的附加信息,这个与图片的格式有关。

滤镜
在对图片的几何操作中可能会将多个输入像素映射到单个的输出像素,pil提供4种不同的采样滤镜(在目前的版本中,后续的版本可能支持更多)

 

NEAREST 最近
BILINEAR 双线型
BICUBIC 双三次插值
ANTIALIAS 平滑

 

 

在RGB模式下,每个图片由三个通道叠加而成,每个模式下为一个灰度图,当有一个调色板来调色的时候,这三张灰度图的叠加即可合成3*8位(每个像素)的一个真彩图片。pil库中,图片之间的模式(mode)可以转化。下面给出一些简单的例子,例子中的所有图片均来自于国家地理的官网,为了使得文档比较短小,每个图片均使用Pil缩放成1/2大小,如有侵权嫌疑,请尽快联系,我会删除这些图片。

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(3901) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
2019-05-06 17:33:45 Code_Mart 阅读数 459
  • Python全栈】第六周 Django框架

    本周课程主要讲解Python的Web框架Django,具体有Django框架的安装、快速入门、URL路由配置、Model模型、View视图、Template模板、以及常用的web工具和其他核心功能。通过本周学习让学员可以掌握:Django框架的快速搭建、使用网站Admin后台管理、数据库表信息的增、删、改、查、验证码的使用、文件上传,图片处理、数据分页和富文本编辑器的使用等等技能。

    665 人正在学习 去看看 CSDN就业班

经常需要使用 Python 对图像做处理,那就免不了使用一些图像处理库,特地写了这篇博客记录一下常用的图像处理库。

目录

  1. OpenCV 速查表
  2. PIL 速查表
  3. Matplotlib 速查表

1. OpenCV 速查表

Open Source Computer Vision, 其更广为人知的名字是OpenCV,是 Intel 开源计算机视觉库,由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV 使用 C/C++ 开发,同时也提供了 Python、Java、MATLAB 等其他语言的接口。本文主要是对 OpenCV-Python 的接口进行描述。
此处为相应的文档链接:[英文] [中文]

由 OpenCV 支持的主要格式有:

  • Windows bitmaps(*.bmp、*dib);
  • Portable image formats(.pbm、.pgm、*.ppm);
  • Sun rasters(.sr、.ras);

需要辅助库的格式有:

  • JPEG(.jpeg、.jpg、*.jpe);
  • JPEG 2000(*.jp2);
  • Portable Network Graphics(*.png);
  • TIFF(.tiff、.tif);
  • WebP(*.webp);

-读取图像并显示图像

import cv2
# 读取图像,默认读入彩色图像
# cv2.imread(path,flag = cv2.IMREAD_COLOR)
# cv2.IMREAD_COLOR:加载彩色图像。任何形象的透明度将被忽略。这是默认的标志。
# cv2.IMREAD_GRAYSCALE:以灰度模式加载图像
# cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像
# 除了上面这三个标志,你可以简单地传递整数 1,0,-1。
img = cv2.imread('example.jpg') # 当该图像不存在时,返回 None
# 显示图像
cv2.namedWindow('example',cv2.WINDOW_NORMAL) # 创建窗口
cv2.imshow('example',example) # 在指定窗口中显示图像
cv2.waitKey(0) # 等待键盘输入,若传入参数为0,则程序将无限制等待用户的案件事件,否则,程序等待所传入参数对应的毫秒时间后,跳出循环。
# 如果程序想响应某个按键,可这样写 :
# if waitKey(0)==Keyvalue:
#     pass 
cv2.destroyAllWindows() # 删除所有建立的窗口,若需删除指定窗口,则使用cv2.destroyWindow(),并传入指定窗口的名称。

-保存图像

import cv2
# 读取图像
img = cv2.imread('example.jpg')
# 保存图像
# 还可以指定保存图像的品质或压缩率
# 对于 jpg 图像,cv2.imwrite(path,img,[cv2.IMWRITE_JPEG_QUALITY,90]),参数范围为 0~100
# 对于 png 图像,cv2.imwrite(path,img,[cv2.IMWRITE_PNG_COMPRESSION,5]),参数范围为 0~9
cv.imwrite('example.png')

-转换图像格式

import cv2
img = cv2.imread('example.jpg')
# 由 RGB 转为 灰度图
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 由 RGB 转为 HSV
img = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

-图像坐标轴
注意:在 OpenCV 中,RGB 图像的通道顺序为 BGR。
OpenCV 所读进来的图像本身就是一个 np.ndarray 实例,其维度为 (height,width,channels),其原点坐标位于图像的左上角。

-常用方法

import cv2
# 读取图像
img = cv2.imread('example.jpg')
# 图像缩放
# cv2 的图像维度一般以 (height,width,channel)存在,但 resize 不同,以(width,height,channel)存在,且默认采用双线性插值。
# 可选参数 nninterpolation 的取值范围:
# cv2.INTER_NEAREST	最近邻插值
# cv2.INTER_LINEAR	双线性插值(默认设置)
# cv2.INTER_AREA	使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于 INTER_NEAREST方法。
# cv2.INTER_CUBIC	4x4像素邻域的双三次插值
# cv2.INTER_LANCZOS4	8x8像素邻域的Lanczos插值
img = cv2.resize(img,(width,height))
# 通道分离
b,g,r = cv2.split(img)
# 合并通道
img = cv2.merge((b,g,r))
# 复制图像
img = img.copy()
# 获取ROI
ROI = img[top:low,left:right]
# 由 PIL 格式转化为 OpenCV 格式
img = cv2.cvtColor(numpy.asarray(image),cv2.COLOR_RGB2BGR)

2. PIL 速查表

Python Imaging Library ,或者叫 PIL,简略来说, 是Python图像操作的核心库。
不幸的是,它的开发陷入了停滞,最后一次更新是2009年,只支持到 Python 2.7。
不过,目前仍存在一个活跃的 PIL 开发分支,叫做 Pillow。它很容易安装,运行在虽有的主流操作系统上,而且支持Python 3.x。
此处为相应的文档链接:[英文] [中文]

  • 读取图像,查看图像信息并显示图像
from PIL import Image
# 读取图像
# Image.open() 返回 Image 类的实例,不需要指定图像格式,由文件内容自动确定图像格式。
img = Image.open('example.jpg')
# 显示图像
img.show()
# Image 类有5个属性,分别如下所示:
# format : 返回图像的格式(PNG,JPG,None等,。如果图像不是从文件读取的,它的值就是 None。
# mode : 返回图像的模式,常用模式有 L (luminance) 表示灰度图像, RGB 表示真彩色图像, CMYK 表示出版图像。
# size : 返回 (width, height),宽度和高度,单位都是px。
# palette : 仅当 mode 为 P 时有效,返回 ImagePalette 实例。
# info : 以字典的形式返回实例的信息。
  • 保存图像
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
# 保存图像
# 调用 Image 类的函数 save,save(filename,format) 函数以特定的图像格式保存图像。
# 若不指定图像格式,save() 方法会根据文件扩展名来选择相应的图像格式。
img.save('OtherExample.jpg')
  • 转换图像模式
from PIL import Image
img = Image.open('example.jpg')
# 由 RGB 模式转为 L 模式,即将彩色图像转为灰度图像
img = img.convert('L')
  • 图像与张量的转换
import numpy as np
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
# 将 Image 实例转换为 np.ndarray 实例
img = np.array(img)
# 将 np.ndarray 实例转换为 Image 实例
img = Image.fromarray(img)
  • 图像坐标轴
    由于 PIL 读取图像后并不是直接以 np.ndarray 的形式存在的,而是以 Image 实例的形式所存在。
    所以要想探究图像的坐标轴,我们得先进行图像与张量得转换。
    查阅资料后,可以得知:
    图片坐标和数组坐标是相反的,坐标原点位于左上角。
    图片坐标第一维是横向向右,第二维纵向向下。
    但是数组坐标第一维是纵向向下,第二维横向向右。
import numpy as np
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
print(img.size) # 输出:(400,200)
# 将 Image 实例转换为 np.ndarray 实例
img = np.array(img)
print(img.shape)# 输出:(200,400,3)
  • 常用方法
from PIL import Image
# 读取图像
img = Image.open('example.jpg')
# 图像缩放
img = img.resize((width, height))
# 带 ANTIALIAS 滤镜缩放结果的图像缩放
img = img.resize((width, height),Image.ANTIALIAS)
# 通道分离
r, g, b = img.split()
# 合并通道
img = Image.merge("RGB", (b, g, r))
# 复制图像
img = img.copy()
# 获取 ROI
ROI = img.crop((left,upper,right,lower))
# 由 OpenCV 格式转化为 PIL 格式
image = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) 

3. Matplotlib 速查表

Matplotlib 应该是 Python 2D-绘图领域使用最广泛的套件,它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
Matplotlib 的功能和 Matlab 中的画图的功能十分类似,但是 Matlab 进行画图相对来说比较复杂,所以使用 Python 中的 Matplotlib 来画图比较方便。
此处为相应的文档链接:[英文] [中文]

读取图像并展示图像

import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片

# 读取图像
lena = mpimg.imread('example.png') 

# 展示图像
plt.figure("Image") # 设置窗口名称,窗口大小可通过可选参数 figsize 进行设置
plt.imshow(img)    # 绘制图像,若图像为灰度图,应这样写:plt.imshow(img,cmap='gray')
plt.axis('on') 	    # 显示坐标轴,若不想展示坐标轴,应这样写:plt.axis('off')
plt.title('image')  # 设置图像名称
plt.show()      # 展示图像


img = Image.open(os.path.join('images', '2007_000648' + '.jpg'))
gray = img.convert('L')
r,g,b = img.split()
img_merged = Image.merge('RGB', (r, g, b))

# 同时展示多副图像
plt.figure("Other Image") 
plt.suptitle('Multi_Image') 
plt.subplot(2,2,1), plt.title('1'), plt.imshow(img),plt.axis('off')
plt.subplot(2,2,2), plt.title('2'), plt.imshow(img),plt.axis('off')
plt.subplot(2,2,3), plt.title('3'), plt.imshow(img),plt.axis('off')
plt.subplot(2,2,4), plt.title('4'), plt.imshow(img),plt.axis('off')
plt.show()

# 保存图像
plt.savefig("example.jpg")

常用函数

import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片

# 绘制函数

# 绘制单个函数:
plot([x], y, [format1])
# 绘制多个函数:
plot([x], y, [format1], [x2], y2, [format2], ..., [xn], [yn], [formatn])
# 绘制多个函数并对每个函数进行区分:
plot([x], y, [format1], [label1], [x2], y2, [format2], [label2], ..., [xn], [yn], [formatn], [labeln])
# 可选参数 [format] 是一个字符串来定义图的基本属性如:颜色(color),点型(marker),线型(linestyle),
# 具体形式 format = '[color][marker][line]'
# format 接收的是每个属性的单个字母缩写,例如:
# plot(x, y, 'bo-')  # 蓝色圆点实线

# 绘制直方图
plt.bar(x, y)
# plt.bar(left, height, width=0.8, bottom=None, **kwargs)
# left,height,width,bottom这四个参数确定了柱体的位置和大小。
# 默认情况下,left为柱体的居中位置(可以通过align参数来改变left值的含义),即:
# (left - width / 2, bottom)为左下角位置
# (left + width / 2, bottom + height)为右上角位置

参考资料:


如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!

作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink

2019-06-09 18:23:21 zzqaaasss 阅读数 4596
  • Python全栈】第六周 Django框架

    本周课程主要讲解Python的Web框架Django,具体有Django框架的安装、快速入门、URL路由配置、Model模型、View视图、Template模板、以及常用的web工具和其他核心功能。通过本周学习让学员可以掌握:Django框架的快速搭建、使用网站Admin后台管理、数据库表信息的增、删、改、查、验证码的使用、文件上传,图片处理、数据分页和富文本编辑器的使用等等技能。

    665 人正在学习 去看看 CSDN就业班

实验环境:windows10,pyCharm

本文在如下博文的基础上进行:

python图像处理 (一).PIL图像处理库学习①

1、自定义创建图片

PIL除了可以从文件中打开一张图片,我们也可以创建一张图片

Image.new(mode,size) ⇒ image
Image.new(mode, size,color) ⇒ image

创建具有给定模式和大小的新图像。Size以(宽、高)-元组的形式给出,单位为像素。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值),如果省略颜色参数,则图像将填充0(这通常对应于黑色)。如果颜色为None,则不初始化图像。如果你要在图像中粘贴或绘制东西,这是很有用的。

如下创建了一张三通道大小为255*255的红色图像:

from PIL import Image  #导入PIL库中的Image模块
im = Image.new("RGB", (128, 128), "red") #新建图像
im.show()

显示效果如下:

 2、复制图像

im.crop(box) ⇒ image

复制图像。如果您希望将内容粘贴到图像中,但仍保留原始内容,请使用此方法。

如下返回的和原图一样的:

from PIL import Image  #导入PIL库中的Image模块
im = Image.new("RGB", (225, 225), "red")  #新建图像
new_im = im.copy() #复制图像

3、裁剪图像

im.crop(box) ⇒ image

从当前图像返回矩形区域的副本。box是一个定义左、上、右和下像素坐标的4元组。
这是一个延迟操作。对源图像的更改可以反映在裁剪后的图像中,也可以不反映在裁剪后的图像中。要获得单独的副本,请调用裁剪副本上的load方法。

代码如下:

from PIL import Image  #导入PIL库中的Image模块
im = Image.open("images/mm.png")
im.show()  #显示原图
box = (100,100,300,300)  #裁剪区域
new_im = im.crop(box) #裁剪图片
new_im.show()  #显示裁剪区域

效果如下:

4、粘贴图像

im.paste(image, box)

将另一个图像粘贴到此图像中。box参数要么是一个给出左上角的2元组,要么是一个定义左、上、右和下像素坐标的4元组,要么没有(与(0,0)相同)。如果给定一个4元组,则粘贴图像的大小必须与区域的大小匹配。
如果模式不匹配,则将粘贴的图像转换为此图像的模式

如下打开一张图像然后在图像上粘贴一个自己创建的图像:

from PIL import Image  #导入PIL库中的Image模块
im1 = Image.open("images/mm.png")
box = (100,100,300,300)  #粘贴区域
im2 = Image.new('RGB',(200,200),'red')  #创建一张图像
im1.paste(im2,box) #在box区域粘贴im2图像
im1.show()

效果如下:

使用:im1.paste('red',box) 和上面效果相同

5、滤波器

im.filter(filter) ⇒ image

返回由给定过滤器过滤的图像的副本。有关可用过滤器的列表,请参见下表。

filtes

描述
BLUR 模糊滤镜
CONTOUR 轮廓滤镜
DETAIL 细节滤镜
EDGE_ENHANCE 边界增强滤镜
EDGE_ENHANCE_MORE 边界增强加强版滤镜
 EMBOSS 浮雕滤镜
FUND_EDGES 寻找边界滤镜
SMOOTH 平滑滤镜
SOOTH_MORE 平滑滤镜加强版
SHARPEN 锐化滤镜

如下举个小列子:

from PIL import Image  #导入PIL库中的Image模块
from PIL import ImageFilter  #导入PIL库中的ImageFilter模块
im = Image.open("images/mm.png").resize((255,255))
im.show()
BLUR_im = im.filter(ImageFilter.BLUR)
CONTOUR_im = im.filter(ImageFilter.CONTOUR)
DETAIL_im = im.filter(ImageFilter.DETAIL)
EMBOSS_im = im.filter(ImageFilter.EMBOSS)
DETAIL_im.show()
EMBOSS_im.show()
BLUR_im.show()
CONTOUR_im.show()

效果如下:

 

剩下的自己试下。

6、混合图像

Image.blend(image1, image2, alpha) ⇒ image

使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。混合公式如下:

混合公式为:out = image1 (1.0 - alpha) + image2 alpha

若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值无限制。

例子如下:

from PIL import Image  #导入PIL库中的Image模块
from PIL import ImageFilter  #导入PIL库中的ImageFilter模块
im1 = Image.open("images/mm.png").resize((255,255)).convert('RGB') #为了和图像2的大小和模式一样重置大小和模式
im2 = Image.open("images/rb.jpg").resize((255,255))  ##为了和图像1的大小和模式一样重置大小和模式
#im1和im2按照第一张60%的透明度,第二张40%的透明度,合成为一张。
new_im = Image.blend(im1,im2,0.6) #混合图像
new_im.show()

效果如下:

 7、分离图像

im.split() ⇒ sequence

 返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)

测试代码如下:

from PIL import Image  #导入PIL库中的Image模块
im = Image.open("images/mm.png").resize((128,128)).convert('RGB')
r,g,b = im.split()
r.show()
g.show()
b.show()

 效果如下:

 差别不是很大,但还是有差别的。

 

 

 

 

2019-11-16 23:55:24 weixin_42119415 阅读数 23
  • Python全栈】第六周 Django框架

    本周课程主要讲解Python的Web框架Django,具体有Django框架的安装、快速入门、URL路由配置、Model模型、View视图、Template模板、以及常用的web工具和其他核心功能。通过本周学习让学员可以掌握:Django框架的快速搭建、使用网站Admin后台管理、数据库表信息的增、删、改、查、验证码的使用、文件上传,图片处理、数据分页和富文本编辑器的使用等等技能。

    665 人正在学习 去看看 CSDN就业班

1.Introduction

PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。 PIL历史悠久,原来是只支持python2.x的版本的,后来出现了移植到python3的库pillow,pillow号称是friendly fork for PIL,其功能和PIL差不多,但是支持python3。本文主要介绍PIL那些最常用的特性与用法,主要参考自:http://www.effbot.org/imagingbook。

2.What PIL can do?

PIL可以做很多和图像处理相关的事情:
图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。
图像展示(Image Display)。PIL较新的版本支持包括Tk PhotoImage,BitmapImage还有Windows DIB等接口。PIL支持众多的GUI框架接口,可以用于图像展示。
图像处理(Image Processing)。PIL包括了基础的图像处理函数,包括对点的处理,使用众多的卷积核(convolution kernels)做过滤(filter),还有颜色空间的转换。PIL库同样支持图像的大小转换,图像旋转,以及任意的仿射变换。PIL还有一些直方图的方法,允许你展示图像的一些统计特性。这个可以用来实现图像的自动对比度增强,还有全局的统计分析等。

3.How to use PIL?

3.1 Image class

Image类是PIL中的核心类,你有很多种方式来对它进行初始化,比如从文件中加载一张图像,处理其他形式的图像,或者是从头创造一张图像等。下面是PIL Image类中常用的方法:
open(filename,mode)(打开一张图像)。下面的代码演示了如何从文件打开一张图像:

>>> from PIL import Image
>>> Image.open("dog.jpg","r")
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=296x299 at 0x7F62BDB5B0F0
>
>>> im = Image.open("dog.jpg","r")
>>> print(im.size,im.format,im.mode)
(296, 299) JPEG RGB

Image.open返回一个Image对象,该对象有size,format,mode等属性,其中size表示图像的宽度和高度(像素表示);format表示图像的格式,常见的包括JPEG,PNG等格式;mode表示图像的模式,定义了像素类型还有图像深度等,常见的有RGB,HSV等。一般来说’L’(luminance)表示灰度图像,'RGB’表示真彩图像,'CMYK’表示预先压缩的图像。一旦你得到了打开的Image对象之后,就可以使用其众多的方法对图像进行处理了,比如使用im.show()可以展示上面得到的图像。
save(filename,format)(保存指定格式的图像)

>>> im.save("dog.png",'png')

上面的代码将图像重新保存成png格式。
thumbnail(size,resample)(创建缩略图)

>>> im.thumbnail((50,50),resample=Image.BICUBIC)
>>> im.show()

上面的代码可以创建一个指定大小(size)的缩略图,需要注意的是,thumbnail方法是原地操作,返回值是None。第一个参数是指定的缩略图的大小,第二个是采样的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法。默认是Image.BICUBIC。
crop(box)(裁剪矩形区域)

>>> im = Image.open("dog.jpg","r")
>>> box = (100,100,200,200)
>>> region = im.crop(box)
>>> region.show()

im.crop()
上面的代码在im图像上裁剪了一个box矩形区域,然后显示出来。box是一个有四个数字的元组(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分别表示裁剪矩形区域的左上角x,y坐标,右下角的x,y坐标,规定图像的最左上角的坐标为原点(0,0),宽度的方向为x轴,高度的方向为y轴,每一个像素代表一个坐标单位。crop()返回的仍然是一个Image对象。
transpose(method)(图像翻转或者旋转)

>>> im_rotate_180 = im.transpose(Image.ROTATE_180)
>>> im_rotate_180.show()

上面的代码将im逆时针旋转180°,然后显示出来,method是transpose的参数,表示选择什么样的翻转或者旋转方式,可以选择的值有:
- Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
- Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
- Image.ROTATE_90,表示将图像逆时针旋转90°
- Image.ROTATE_180,表示将图像逆时针旋转180°
- Image.ROTATE_270,表示将图像逆时针旋转270°
- Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
- Image.TRANSVERSE,表示将图像进行转置,再水平翻转
paste(region,box,mask)(将一个图像粘贴到另一个图像)

>>> im.paste(region,(100,100),None)
>>> im.show()

上面的代码将region图像粘贴到左上角为(100,100)的位置。region是要粘贴的Image对象,box是要粘贴的位置,可以是一个两个元素的元组,表示粘贴区域的左上角坐标,也可以是一个四个元素的元组,表示左上角和右下角的坐标。如果是四个元素元组的话,box的size必须要和region的size保持一致,否则将会被convert成和region一样的size。
split()(颜色通道分离)

>>> r,g,b = im.split()
>>> r.show()
>>> g.show()
>>> b.show()

split()方法可以原来图像的各个通道分离,比如对于RGB图像,可以将其R,G,B三个颜色通道分离。
merge(mode,channels)(颜色通道合并)

>>> im_merge = Image.merge("RGB",[b,r,g])
>>> im_merge.show()

merge方法和split方法是相对的,其将多个单一通道的序列合并起来,组成一个多通道的图像,mode是合并之后图像的模式,比如"RGB",channels是多个单一通道组成的序列。
resize(size,resample,box)

>>> im_resize = im.resize((200,200))
>>> im_resize
<PIL.Image.Image image mode=RGB size=200x200 at 0x7F62B9E23470>
>>> im_resize.show()
>>> im_resize_box = im.resize((100,100),box = (0,0,50,50))
>>> im_resize_box.show()

resize方法可以将原始的图像转换大小,size是转换之后的大小,resample是重新采样使用的方法,仍然有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST这四种采样方法,默认是PIL.Image.NEAREST,box是指定的要resize的图像区域,是一个用四个元组指定的区域(含义和上面所述box一致)。
convert(mode,matrix,dither,palette,colors)(mode转换)

>>> im_L = im.convert("L")
>>> im_L.show()
>>> im_rgb = im_L.convert("RGB")
>>> im_rgb.show()
>>> im_L.mode
'L'
>>> im_rgb.mode
'RGB'

convert方法可以改变图像的mode,一般是在’RGB’(真彩图)、‘L’(灰度图)、‘CMYK’(压缩图)之间转换。上面的代码就是首先将图像转化为灰度图,再从灰度图转化为真彩图。值得注意的是,从灰度图转换为真彩图,虽然理论上确实转换成功了,但是实际上是很难恢复成原来的真彩模式的(不唯一)。
filter(filter)(应用过滤器)

>>> im = Image.open("dog.jpg","r")
>>> from PIL import ImageFilter
>>> im_blur = im.filter(ImageFilter.BLUR)
>>> im_blur.show()
>>> im_find_edges = im.filter(ImageFilter.FIND_EDGES)
>>> im_find_edges.show()
>>> im_find_edges.save("find_edges.jpg")
>>> im_blur.save("blur.jpg")

filter方法可以将一些过滤器操作应用于原始图像,比如模糊操作,查找边、角点操作等。filter是过滤器函数,在PIL.ImageFilter函数中定义了大量内置的filter函数,比如BLUR(模糊操作),GaussianBlur(高斯模糊),MedianFilter(中值过滤器),FIND_EDGES(查找边)等。上面得到原始图像dog.jpg,find_edges.jpg以及blur.jpg从左到右如下图1所示:

图1 从左到右分别是:dog.jpg,find_edges.jpg以及blur.jpg

point(lut,mode)(对图像像素操作)

>>> im_point = im.point(lambda x:x*1.5)
>>> im_point.show()
>>> im_point.save("im_point.jpg")

point方法可以对图像进行单个像素的操作,上面的代码对point方法传入了一个匿名函数,表示将图像的每个像素点大小都乘以1.5,mode是返回的图像的模式,默认是和原来图像的mode是一样的。图2是原来的dog.jpg和point操作之后的im_point.jpg之间的对比。

图2 dog.jpg和point操作之后的im_point.jpg

下面是一个结合了point函数,split函数,paste函数以及merge函数的小例子。

>>> source = im.split()
>>> R,G,B = 0,1,2
>>> mask = source[R].point(lambda x: x<100 and 255) 
>>> # x<100,return 255,otherwise return 0
>>> out_G = source[G].point(lambda x:x*0.7)
>>> # 将out_G粘贴回来,但是只保留'R'通道像素值<100的部分
>>> source[G].paste(out_G,None,mask)
>>> # 合并成新的图像
>>> im_new = Image.merge(im.mode,source)
>>> im_new.show()
>>> im.show()

ImageEnhance()(图像增强)

>>> from PIL import ImageEnhance
>>> brightness = ImageEnhanBce.Brightness(im)
>>> im_brightness = brightness.enhance(1.5)
>>> im_brightness.show()
>>> im_contrast = ImageEnhance.Contrast(im)
>>> im_contrast.enhance(1.5)
<PIL.Image.Image image mode=RGB size=296x299 at 0x7F62AE271AC8>
>>> im_contrast.enhance(1.5).show()

ImageEnhance是PIL下的一个子类,主要用于图像增强,比如增加亮度(Brightness),增加对比度(Contrast)等。上面的代码将原来图像的亮度增加50%,将对比度也增加了50%。
ImageSequence()(处理图像序列)
下面的代码可以遍历gif图像中的所有帧,并分别保存为图像

>>> from PIL import ImageSequence
>>> from PIL import Image 
>>> gif = Image.open("pipixia.gif")
>>> for i,frame in enumerate(ImageSequence.Iterator(gif),1):
...     if frame.mode == 'JPEG':
...         frame.save("%d.jpg" %i)
...     else:
...         frame.save("%d.png" % i)

除了上面使用迭代器的方式以外,还可以一帧一帧读取gif,比如下面的代码:

>>> index = 0
>>> while 1:
...     try:
...         gif.seek(index)
...         gif.save("%d.%s" %(index,'jpg' if gif.mode == 'JPEG' else 'png'))
...         index += 1
...     except EOFError:
...         print("Reach the end of gif sequence!")
...         break

上面的代码在读取到gif的最后一帧之后,会throw 一个 EOFError,所以我们只要捕获这个异常就可以了。

2016-03-06 14:03:53 GarfieldEr007 阅读数 3798
  • Python全栈】第六周 Django框架

    本周课程主要讲解Python的Web框架Django,具体有Django框架的安装、快速入门、URL路由配置、Model模型、View视图、Template模板、以及常用的web工具和其他核心功能。通过本周学习让学员可以掌握:Django框架的快速搭建、使用网站Admin后台管理、数据库表信息的增、删、改、查、验证码的使用、文件上传,图片处理、数据分页和富文本编辑器的使用等等技能。

    665 人正在学习 去看看 CSDN就业班
用Python做图像处理
       最近在做一件比较 evil 的事情——验证码识别,以此来学习一些新的技能。因为我是初学,对图像处理方面就不太了解了,欲要利吾事,必先利吾器,既然只是做一下实验,那用 Python 来作原型开发再好不过了。在 Python 中,比较常用的图像处理库是 PIL(Python Image Library),当前版本是 1.1.6 ,用起来非常方便。大家可以在 http://www.pythonware.com/products/pil/index.htm 下载和学习。
       在这里,我主要是介绍一下做图像识别时可能会用到的一些 PIL 提供的功能,比如图像增强、还有滤波之类的。最后给出使用 Python 做图像处理与识别的优势与劣势。
基本图像处理
       使用 PIL 之前需要 import Image 模块:
import Image
       然后你就可以使用Image.open(‘xx.bmp’) 来打开一个位图文件进行处理了。打开文件你不用担心格式,也不用了解格式,无论什么格式,都只要把文件名丢给 Image.open 就可以了。真所谓 bmp、jpg、png、gif……,一个都不能少。
img = Image.open(‘origin.png’)    # 得到一个图像的实例对象 img
图 1原图
       图像处理中,最基本的就是色彩空间的转换。一般而言,我们的图像都是 RGB 色彩空间的,但在图像识别当中,我们可能需要转换图像到灰度图、二值图等不同的色彩空间。 PIL 在这方面也提供了极完备的支持,我们可以:
new_img = img.convert(‘L’)
把 img 转换为 256 级灰度图像, convert() 是图像实例对象的一个方法,接受一个 mode 参数,用以指定一种色彩模式,mode 的取值可以是如下几种:
· 1 (1-bit pixels, black and white, stored with one pixel per byte)
· L (8-bit pixels, black and white)
· P (8-bit pixels, mapped to any other mode using a colour palette)
· RGB (3x8-bit pixels, true colour)
· RGBA (4x8-bit pixels, true colour with transparency mask)
· CMYK (4x8-bit pixels, colour separation)
· YCbCr (3x8-bit pixels, colour video format)
· I (32-bit signed integer pixels)
· F (32-bit floating point pixels)
怎么样,够丰富吧?其实如此之处,PIL 还有限制地支持以下几种比较少见的色彩模式:LA (L with alpha), RGBX (true colour with padding) and RGBa (true colour with premultiplied alpha)。
下面看一下 mode 为 ‘1’、’L’、’P’时转换出来的图像:
图 2 mode = '1'
图 3 mode = 'L'
图 4 mode = 'P'
convert() 函数也接受另一个隐含参数 matrix,转换矩阵 matrix 是一个长度为4 或者16 tuple。下例是一个转换 RGB 空间到 CIE XYZ 空间的例子:
    rgb2xyz = (
        0.412453, 0.357580, 0.180423, 0,
        0.212671, 0.715160, 0.072169, 0,
        0.019334, 0.119193, 0.950227, 0 )
    out = im.convert("RGB", rgb2xyz)
       除了完备的色彩空间转换能力外, PIL 还提供了resize()、rotate()等函数以获得改变大小,旋转图片等几何变换能力,在图像识别方面,图像实例提供了一个 histogram() 方法来计算直方图,非常方便实用。
图像增强
       图像增强通常用以图像识别之前的预处理,适当的图像增强能够使得识别过程达到事半功倍的效果。 PIL 在这方面提供了一个名为 ImageEnhance 的模块,提供了几种常见的图像增强方案:
import ImageEnhance
enhancer = ImageEnhance.Sharpness(image)
for i in range(8):
    factor = i / 4.0
    enhancer.enhance(factor).show("Sharpness %f" % factor)
上面的代码即是一个典型的使用 ImageEnhance 模块的例子。 Sharpness 是 ImageEnhance 模块的一个类,用以锐化图片。这一模块主要包含如下几个类:Color、Brightness、Contrast和Sharpness。它们都有一个共同的接口 .enhance(factor) ,接受一个浮点参数 factor,标示增强的比例。下面看看这四个类在不同的 factor 下的效果
图 5 使用Color 进行色彩增强,factor 取值 [0, 4],步进 0.5
图 6 用 Birghtness 增强亮度,factor取值[0,4],步进0.5
图 7用 Contrast 增强对比度, factor 取值 [0,4],步进0.5
图 8用 Sharpness 锐化图像,factor取值 [0,4],步进0.5
图像 Filter
       PIL 在 Filter 方面的支持是非常完备的,除常见的模糊、浮雕、轮廓、边缘增强和平滑,还有中值滤波、ModeFilter等,简直方便到可以做自己做一个Photoshop。这些 Filter 都放置在 ImageFilter 模块中,ImageFilter主要包括两部分内容,一是内置的 Filter,如 BLUR、DETAIL等,另一部分是 Filter 函数,可以指定不同的参数获得不同的效果。示例如下:
import ImageFilter
im1 = im.filter(ImageFilter.BLUR)
im2 = im.filter(ImageFilter.MinFilter(3))
im3 = im.filter(ImageFilter.MinFilter()) # same as MinFilter(3)
可以看到 ImageFilter 模块的使用非常简单,每一个 Filter 都只需要一行代码就可调用,开发效率非常高。
 
图 9使用 BLUR
图 10使用 CONTOUR
图 11使用 DETAIL
图 12使用 EMBOSS
图 13使用 EDGE_ENHANCE
图 14使用 EDGE_ENHANCE_MORE
图 15使用 FIND_EDGES
图 16使用 SHARPEN
图 17使用 SMOOTH
图 18使用 SMOOTH_MORE
       以上是几种内置的 Filter 的效果图,除此之外, ImageFilter 还提供了一些 Filter 函数,下面我们来看看这些可以通过参数改变行为的 Filter 的效果:
图 19使用 Kernel(),参数:size = (3, 3), kernel = (0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5)
图 20使用 MaxFilter,默认参数
图 21使用 MinFilter,默认参数
图 22使用 MedianFilter,默认参数
图 23使用 ModeFilter,参数 size = 3
图 24使用 RankFilter,参数 size = 3, rank = 3
小结
       到此,对 PIL 的介绍就告一段落了。总的来说,对于图像处理和识别,PIL 内建了强大的支持,从各种增强算法到 Filter ,都让人无法怀疑使用 Python 的可行性。 Python唯一的劣势在于执行时间过慢,特别是当实现一些计算量大的算法时候,需要极强的耐心。我曾用 Hough Transform(霍夫变换)来查找图像中的直线,纯 Python 的实现处理一个 340 * 100 的图片也要花去数秒时间(P4 3.0G + 1G memory)。但使用 PIL 无需关注图像格式、内建的图像增强算法和 Filter 算法,这些优点使 Python 适合用于构造原型和进行实验,在这两方面Python 比 matlab 更加方便。商业的图像识别产品开发,可以考虑已经被 boost accepted的来自 adobe 的开源 C++ 库 gil,可以兼顾执行性能和开发效率。
没有更多推荐了,返回首页