python
图像处理
计算机中,将红、绿、蓝三种色光以不同的比例叠加来组合成其他的颜色,这三种颜色就是色光三原色,所以我们通常会将一个颜色表示为一个RGB值或RGBA值(R表示红色G表示绿色B表示蓝色,其中的A表示Alpha通道,它决定了透过这个图像的像素,也就是透明度)。
Red (255, 0, 0, 255)
Green (0, 255, 0, 255)
Blue (0, 0, 255, 255)
像素,对于一个由数字序列表示的图像来说,最小的单位就是图像上单一颜色的小方格,这些小方块都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置决定了该图像最终呈现出来的样子,它们是不可分割的单位,我们通常称之为像素(pixel)。每一个图像都包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
python 用Pillow操作图像
pip install pillow
Pillow中最为重要的是Image类,读取和处理图像都要通过这个类来完成。
缩略 thumbnail(宽,高)
from PIL import Image
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('./test.jpg')
# 获得图像尺寸: .size
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 缩放到50%: #thumbnail 缩略图
im.thumbnail((w//2, h//2)) #" / "就表示 浮点数除法,返回浮点结果;" // "表示整数除法。
print('Resize image to: %sx%s' % (w//2, h//2))
# 把缩放后的图像用jpeg格式保存: 可以命名为新名
im.save('new.jpg', 'jpeg')
剪裁 crop([左,上,右,下 ])
from PIL import Image
image = Image.open('./user/test.jpg')
rect = [80, 80, 80, 60]
image.crop(rect).show() #.crop([img.size[0]/4,img.size[1]/4,img.size[0]*3/4,img.size[1]*3/4]) (left, upper, right, lower),Python Imaging Library 使用左上角为 (0, 0)的坐标系统
缩放和黏贴图像
image1 = Image.open(’./res/1.png’)
image2 = Image.open(’./res/2.jpg’)
rect = 80, 20, 310, 360
crop_image = image2.crop(rect)
width, height = crop_image .size
image1.paste(crop_image .resize((int(width / 1.5), int(height / 1.5))), (172, 40))
#crop函数带的参数为(起始点的横坐标,起始点的纵坐标,宽度,高度)
#paste函数的参数为(需要修改的图片,粘贴的起始点的横坐标,粘贴的起始点的纵坐标)
旋转和翻转
from PIL import Image
image = Image.open('./user/test.png')
im_image = image.rotate(180) #逆时针旋转
im_image.show()
out = image .transpose(Image.FLIP_LEFT_RIGHT) #左右翻转
out = image .transpose(Image.FLIP_TOP_BOTTOM) #上下翻转
out = image .transpose(Image.ROTATE_90) #逆时针90度
out = image .transpose(Image.ROTATE_180) #逆时针180度
out = image .transpose(Image.ROTATE_270) #您是真270度
#out.show()
操作像素
#左上为坐标原点(0,0) X轴是从左到右增长的,而Y轴是从上到下增长。
image = Image.open('./user/test.jpg')
for x in range(10, 100):
. for y in range(20, 360):
image.putpixel((x, y), (255, 0, 0))
image.show()
#putpixel(元组做参数,rgb) (x,y)像素的颜色被覆盖
滤镜效果
from PIL import Image, ImageFilter
image = Image.open('./user/test.jpg')
out = image.filter(ImageFilter.CONTOUR)
out.show()
ImageFilter类中预定义了如下滤波方法 列举常用的
• BLUR:模糊滤波
• CONTOUR:轮廓滤波
• DETAIL:细节滤波
• EDGE_ENHANCE:边界增强滤波
• EDGE_ENHANCE_MORE:边界增强滤波(程度更深)
• EMBOSS:浮雕滤波
• FIND_EDGES:寻找边界滤波
• SMOOTH:平滑滤波
• SMOOTH_MORE:平滑滤波(程度更深)
• SHARPEN:锐化滤波
验证码
PIL的ImageDraw生成字母验证码图片:
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random #生成随机数需要
# 随机字母:
def rndChar():
return chr(random.randint(65, 90))
#chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
#random.randint(a,b)用于生成一个指定范围内的整数。生成的随机数n: a <= n <= b
# 随机颜色1:
def rndColor():
return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
# 随机颜色2:
def rndColor2():
return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
# 320 x 60:
width = 80 * 4 #有4个字母
height = 60
image = Image.new('RGB', (width, height), (255, 255, 255)) #给定模式(mode)和尺寸(size),RGB
# 创建Font对象:
font = ImageFont.truetype('./arial.ttf', 36) #设置字体 及大小
# 创建Draw对象:
draw = ImageDraw.Draw(image) #创建一个可以在给定图像上绘图的对象。
# 填充每个像素:
for x in range(width):
for y in range(height):
draw.point((x, y), fill=rndColor()) #point(绘图区,颜色)
# 输出文字:
for t in range(4):
draw.text((80 * t + 10, 10), rndChar(), font=font, fill=rndColor2()) #text((x,y),颜色)
# 模糊:
image = image.filter(ImageFilter.BLUR) #模糊滤波
image.save('code.jpg', 'jpeg') #保存