Python简单处理图片
来源:互联网 发布:linux 卸载ant 编辑:程序博客网 时间:2024/05/03 13:27
**
任务
批量处理图片,调整size 256*256 or 224*224能够使得图片输入到主流的深度学习网络框架中**
查找博客,学习操作。
一、图片的打开与显示
from PIL import Imageimg=Image.open('d:/dog.png')img.show()
虽然使用的是Pillow,但它是由PIL fork而来,因此还是要从PIL中进行import. 使用open()函数来打开图片,使用show()函数来显示图片。
这种图片显示方式是调用操作系统自带的图片浏览器来打开图片,有些时候这种方式不太方便,因此我们也可以使用另上一种方式,让程序来绘制图片。
from PIL import Imageimport matplotlib.pyplot as pltimg=Image.open('d:/dog.png')plt.figure("dog")plt.imshow(img)plt.show()
figure默认是带axis的,如果没有需要,我们可以关掉
plt.axis('off')
打开图片后,可以使用一些属性来查看图片信息,如
print img.size #图片的尺寸print img.mode #图片的模式print img.format #图片的格式
显示结果为:
(558, 450)RGBAPNG
二、图片的保存
img.save('d:/dog.jpg')
就一行代码,非常简单。这行代码不仅能保存图片,还是转换格式,如本例中,就由原来的png图片保存为了jpg图片。
一、图像通道
1、彩色图像转灰度图
from PIL import Imageimport matplotlib.pyplot as pltimg=Image.open('d:/ex.jpg')gray=img.convert('L')plt.figure("beauty")plt.imshow(gray,cmap='gray')plt.axis('off')plt.show()
使用函数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)
2、通道分离与合并
from PIL import Imageimport matplotlib.pyplot as pltimg=Image.open('d:/ex.jpg') #打开图像gray=img.convert('L') #转换成灰度r,g,b=img.split() #分离三通道pic=Image.merge('RGB',(r,g,b)) #合并三通道plt.figure("beauty")plt.subplot(2,3,1), plt.title('origin')plt.imshow(img),plt.axis('off')plt.subplot(2,3,2), plt.title('gray')plt.imshow(gray,cmap='gray'),plt.axis('off')plt.subplot(2,3,3), plt.title('merge')plt.imshow(pic),plt.axis('off')plt.subplot(2,3,4), plt.title('r')plt.imshow(r,cmap='gray'),plt.axis('off')plt.subplot(2,3,5), plt.title('g')plt.imshow(g,cmap='gray'),plt.axis('off')plt.subplot(2,3,6), plt.title('b')plt.imshow(b,cmap='gray'),plt.axis('off')plt.show()
二、裁剪图片
从原图片中裁剪感兴趣区域(roi),裁剪区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。
from PIL import Imageimport matplotlib.pyplot as pltimg=Image.open('d:/ex.jpg') #打开图像plt.figure("beauty")plt.subplot(1,2,1), plt.title('origin')plt.imshow(img),plt.axis('off')box=(80,100,260,300) #四个数值为两个点的坐标,左上角横纵坐标,右下角横纵坐标roi=img.crop(box)plt.subplot(1,2,2), plt.title('roi')plt.imshow(roi),plt.axis('off')plt.show()
三、几何变换
Image类有resize()、rotate()和transpose()方法进行几何变换。
1、图像的缩放和旋转
dst = img.resize((128, 128))dst = img.rotate(45) # 顺时针角度表示
2、转换图像
dst = im.transpose(Image.FLIP_LEFT_RIGHT) #左右互换dst = im.transpose(Image.FLIP_TOP_BOTTOM) #上下互换dst = im.transpose(Image.ROTATE_90) #顺时针旋转dst = im.transpose(Image.ROTATE_180)dst = im.transpose(Image.ROTATE_270)
transpose()和rotate()没有性能差别。
用python简单处理图片(4):图像中的像素访问
前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作。如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了。因此,通常我们加载完图片后,都是把图片转换成矩阵来进行更加复杂的操作。
python中利用numpy库和scipy库来进行各种数据操作和科学计算。我们可以通过pip来直接安装这两个库
pip install numpypip install scipy
以后,只要是在python中进行数字图像处理,我们都需要导入这些包:
from PIL import Imageimport numpy as npimport matplotlib.pyplot as plt
打开图像并转化为矩阵,并显示:
from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltimg=np.array(Image.open('d:/lena.jpg')) #打开图像并转化为数字矩阵plt.figure("dog")plt.imshow(img)plt.axis('off')plt.show()
调用numpy中的array()函数就可以将PIL对象转换为数组对象。
查看图片信息,可用如下的方法:
print img.shape print img.dtype print img.size print type(img)如果是RGB图片,那么转换为array之后,就变成了一个rows*cols*channels的三维矩阵,因此,我们可以使用img[i,j,k]
来访问像素值。
例1:打开图片,并随机添加一些椒盐噪声
from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltimg=np.array(Image.open('d:/ex.jpg'))
随机生成500个椒盐噪声rows,cols,dims=img.shapefor i in range(5000): x=np.random.randint(0,rows) y=np.random.randint(0,cols) img[x,y,:]=255plt.figure("beauty")plt.imshow(img)plt.axis('off')plt.show()
例2:将lena图像二值化,像素值大于128的变为1,否则变为0
from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltimg=np.array(Image.open('d:/pic/lena.jpg').convert('L'))rows,cols=img.shapefor i in range(rows): for j in range(cols): if (img[i,j]<=128): img[i,j]=0 else: img[i,j]=1plt.figure("lena")plt.imshow(img,cmap='gray')plt.axis('off')plt.show()
如果要对多个像素点进行操作,可以使用数组切片方式访问。切片方式返回的是以指定间隔下标访问 该数组的像素值。下面是有关灰度图像的一些例子:
img[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行img[:,i] = 100 # 将第 i 列的所有数值设为 100img[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和img[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)img[i].mean() # 第 i 行所有数值的平均值img[:,-1] # 最后一列img[-2,:] (or im[-2]) # 倒数第二行
图像直方图
我们先来看两个函数reshape和flatten:
假设我们先生成一个一维数组:
vec=np.arange(15)print vec
显示为:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
如果我们要把这个一维数组,变成一个3*5二维矩阵,我们可以使用reshape来实现
mat= vec.reshape(3,5)print mat
显示为
[[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]]
现在如果我们返过来,知道一个二维矩阵,要变成一个一维数组,就不能用reshape了,只能用flatten. 我们来看两者的区别
a1=mat.reshape(1,-1) #-1表示为任意,让系统自动计算print a1a2=mat.flatten()print a2
显示为:
a1: [[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]]a2: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
可以看出,用reshape进行变换,实际上变换后还是二维数组,两个方括号,因此只能用flatten.
我们要对图像求直方图,就需要先把图像矩阵进行flatten操作,使之变为一维数组,然后再进行统计。
一、画灰度图直方图
绘图都可以调用matplotlib.pyplot库来进行,其中的hist函数可以直接绘制直方图。
调用方式:
n, bins, patches = plt.hist(arr, bins=50, normed=1, facecolor='green', alpha=0.75)
hist的参数非常多,但常用的就这五个,只有第一个是必须的,后面四个可选
arr: 需要计算直方图的一维数组
bins: 直方图的柱数,可选项,默认为10
normed: 是否将得到的直方图向量归一化。默认为0
facecolor: 直方图颜色
alpha: 透明度
返回值 :
n: 直方图向量,是否归一化由参数设定
bins: 返回各个bin的区间范围
patches: 返回每个bin里面包含的数据,是一个list
from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltimg=np.array(Image.open('d:/pic/lena.jpg').convert('L'))plt.figure("lena")arr=img.flatten()n, bins, patches = plt.hist(arr, bins=256, normed=1, facecolor='green', alpha=0.75) plt.show()
二、彩色图片直方图
实际上是和灰度直方图一样的,只是分别画出三通道的直方图,然后叠加在一起。
from PIL import Imageimport numpy as npimport matplotlib.pyplot as pltsrc=Image.open('d:/ex.jpg')r,g,b=src.split()plt.figure("lena")ar=np.array(r).flatten()plt.hist(ar, bins=256, normed=1,facecolor='r',edgecolor='r',hold=1)ag=np.array(g).flatten()plt.hist(ag, bins=256, normed=1, facecolor='g',edgecolor='g',hold=1)ab=np.array(b).flatten()plt.hist(ab, bins=256, normed=1, facecolor='b',edgecolor='b')plt.show()
由此可见,matplotlib的画图功能是非常强大的,直方图只是其中非常小的一部分,更多的请参看官方文档:
http://matplotlib.org/api/pyplot_summary.html
- Python简单处理图片
- python PIL图片简单处理
- Python(1):简单图像处理(图片->二进制->图片)
- python处理图片之PIL模块简单使用
- Python图片处理库Wand的简单使用
- 用python简单处理图片(5):图像直方图
- 用python简单处理图片(3):添加水印
- 用python简单处理图片(3):添加水印
- 用python简单处理图片(5):图像直方图
- 用python简单处理图片(5):图像直方图
- opencv-python 学习笔记1:简单的图片处理
- Opencv-图片简单处理
- Python 图片处理-图片翻转
- Python 图片处理-图片翻转
- python-Image处理图片
- python Pillow 处理图片
- python批量图片处理
- Python下处理图片
- mysql left join和union结合的用法
- NPOI数据导入导出帮助管理类
- simpledateformat 字符串转时间
- studio编译错误Error:Failed to open zip file. Gradle's dependency cache may be corrupt
- 进程render要读取一个scene.dat文件过程(normal and mmap)
- Python简单处理图片
- 10道Struts2面试题
- Spring事务异常回滚,捕获异常不抛出就不会回滚
- 测试主管如何规范公司的测试流程?
- Go实战--go中函数递归(recursion)的使用(The way to go)
- SOJ 1303. Job Assignment 与 KM算法模版
- Android 开源框架Universal-Image-Loader完全解析(三)---源代码解读
- 激光雷达学习笔记(五)圆弧
- 命令行选项的处理