1. Installez l'oreiller
pip install pillow
2. Introduction au traitement d'image
Traitement d'image Mode couleur RVB:
-R (rouge) 0--255
-G (vert) 0--255
-B (bleu) 0--255
Réseau de pixels
Chaque point est un pixel. Chaque point est représenté par une couleur (R, V, B)
Matériel d'image:
3. Présentation du module
A. Modèle d'image
(1) Ouvrez l'image
Exemple: ouvrir une image avec Image
#导入模块
from PIL import Image
#打开图片
img=Image.open('kiki.jpg')
#显示图片
img.show()
print('图片格式:',img.format)
print('图片大小:',img.size)
print('高度:',img.height)
print('宽度:',img.width)
print('(100,100)处的RGB:',img.getpixel((100,100)))
'''
图片格式 JPEG
图片大小 (500, 330)
高度 330
宽度 500
(100,100)处的RGB (2, 6, 5)
'''
(2) Mixte
① Mélange de transparence
mélange (im1, im2, alpha)
im1: image 1, im2: image 2, la transparence de fusion alpha (0-1) est la proportion de im2
Remarque: la taille de im1 et im2 doit être la même
Formule de mélange spécifique: im1 * (1-alpha) + im2 * alpha
#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg')
#图片混合
img1add2=Image.blend(img1,img2,0.5)
#显示图片
img1add2.show()
Résultats mitigés
②Masque de mélange
composite (im1, im2, masque)
Fonction: Utilisez mask pour traiter im1 et im2 ensemble. Les trois images de im1, im2 et mask doivent avoir la même taille.
#导入模块
from PIL import Image
#打开图片并变成相同尺寸(这里本来就相同)
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg').resize(img1.size)
img3=Image.open('niki.jpg').resize(img1.size)
#把img3的rgb分离
r3,g3,b3=img3.split()
img1composite2=Image.composite(img1,img2,b3)
#显示图片
img1composite2.show()
résultat:
(3) Zoom d'image
① Zoom pixel (en fait, réglage de la luminosité):
#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
#将每个像素值扩大2倍
img1_mul2=Image.eval(img1,lambda x:x*2)
#显示图片
img1_mul2.show()
résultat:
② Mise à l'échelle de la taille (changer la taille):
#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=img1.copy()
#将每个像素值缩小一半
img2.thumbnail((img1.size[0]/2,img1.size[1]/2))
#显示图片大小
print('img1:',img1.size)
print('img2:',img2.size)
'''
img1: (500, 330)
img2: (250, 165)
'''
(4) Coller et couper
① Coller:
Image.paste (im, box = None, mask = None)
im: image source ou valeur de pixel; boîte: zone de collage; masque: masque
boîte:
a. (x1, y1): alignez le coin supérieur gauche de l'image (x1, y1) et supprimez-le au-delà de la zone d'image collée
b. (x1, y1, x2, y2): l'image d'origine est cohérente avec cette zone.
c. Aucun: l'image d'origine et l'image collée doivent avoir la même taille.
#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=img1.copy()
#将每个像素值缩小一半
img2.thumbnail((img1.size[0]/3,img1.size[1]/3))
#把img2贴到img1上
img1.paste(img2,(30,40))
img1.show()
résultat:
(5) Rotation de l'image
Image.rotate (angle, resample = 0, expand = 0, center = None, translate = None, fillcolor = None)
angle: angle de rotation
#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img1=img1.rotate(60)
img1.show()
(6) Conversion de format
#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
#上下滤镜
#img2=img1.transpose(Image.FLIP_TOP_BOTTOM)#上下
img2=img1.transpose(Image.FLIP_LEFT_RIGHT)#左右
img2=img1.transpose(Image.ROTATE_90)#旋转90度,尺寸也变
img2=img1.transpose(Image.ROTATE_180)#旋转180度
img2.show()
(7) Séparation d'image (fractionnée), mélange (fusion)
#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img2=Image.open('yoki.jpg').resize(img1.size)
#分离
r1,g1,b1=img1.split()
r2,g2,b2=img2.split()
tempa=[r1,g2,b1]
tempb=[r2,g1,b2]
#混合
imga=Image.merge('RGB',tempa)
imgb=Image.merge('RGB',tempb)
imga.show()
imgb.show()
(7) Filtre d'image
FLOU : filtrage du flou
CONTOUR : filtre Contour
DETAIL : Filtrage des détails
EDGE_ENHANCE : filtrage d'amélioration des limites
EDGE_ENHANCE_MORE : filtrage d'amélioration des limites (plus profond)
EMBOSS : Filtre en relief
FIND_EDGES : rechercher le filtrage des limites
SMOOTH : filtre lissant
SMOOTH_MORE : filtre de lissage (plus profond)
SHARPEN : filtre de netteté
GaussianBlur (rayon = 2) : Flou gaussien
Exemple:
#导入模块
from PIL import Image,ImageFilter
#打开图片
img1=Image.open('kiki.jpg')
img1.thumbnail((img1.size[0]/3,img1.size[1]/3))
w,h=img1.size
#输出图片
img_output=Image.new('RGB',(3*w,4*h))
#高斯模糊
img1_GaussianBlur=img1.filter(ImageFilter.GaussianBlur(radius=3))
#BLUR普通模糊
img1_BLUR=img1.filter(ImageFilter.BLUR)
#DETAIL细节滤波
img1_DETAIL=img1.filter(ImageFilter.DETAIL)
#EDGE_ENHANCE:边界增强滤波
img1_EDGE_ENHANCE=img1.filter(ImageFilter.EDGE_ENHANCE)
#EDGE_ENHANCE_MORE:边界增强滤波(程度更深)
img1_EDGE_ENHANCE_MORE=img1.filter(ImageFilter.EDGE_ENHANCE_MORE)
#EMBOSS浮雕
img1_EMBOSS=img1.filter(ImageFilter.EMBOSS)
#FIND_EDGES:寻找边界滤波
img1_FIND_EDGES=img1.filter(ImageFilter.FIND_EDGES)
#SMOOTH:平滑滤波
img1_SMOOTH=img1.filter(ImageFilter.SMOOTH)
#SMOOTH_MORE:平滑滤波(程度更深)
img1_SMOOTH_MORE=img1.filter(ImageFilter.SMOOTH_MORE)
#SHARPEN:锐化滤波
img1_SHARPEN=img1.filter(ImageFilter.SHARPEN)
#CONTOUR:轮廓滤波
img1_CONTOUR=img1.filter(ImageFilter.CONTOUR)
#拼接
img_output.paste(img1,(0,0))
img_output.paste(img1_GaussianBlur,(w,0))
img_output.paste(img1_BLUR,(2*w,0))
img_output.paste(img1_DETAIL,(0,h))
img_output.paste(img1_EDGE_ENHANCE,(w,h))
img_output.paste(img1_EDGE_ENHANCE_MORE,(2*w,h))
img_output.paste(img1_EMBOSS,(0,2*h))
img_output.paste(img1_FIND_EDGES,(w,2*h))
img_output.paste(img1_SMOOTH,(2*w,2*h))
img_output.paste(img1_SMOOTH_MORE,(0,3*h))
img_output.paste(img1_SHARPEN,(w,3*h))
img_output.paste(img1_CONTOUR,(2*w,3*h))
img_output.show()
résultat:
Je ne veux plus apprendre, je vais jouer à des jeux et je continuerai dans deux jours
Continue
(8) Fonctionnement global de l'image
from PIL import ImageEnhance,Image
im1=Image.open('kiki.jpg')
out=im1.point(lambda i:i*2)#图片整体变亮
out.show()
Module ImageChops
(1) Ajouter des photos
ImageChops.add (im1, im2, échelle = 1.0, décalage = 0)
Formule de calcul:
out = ((im1 + im2) / échelle + décalage)
from PIL import ImageChops,Image
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
out=ImageChops.add(im1,im2,1,0)
out.show()
(2) Soustraction d'image
ImageChops.subtract (im1, im2, échelle = 1.0, décalage = 0)
Formule de calcul:
out = ((im1-im2) / échelle + décalage)
(3) L'image devient plus sombre
ImageChops.darker (im1, im2)
Comparez les pixels des deux images, prenez la plus petite valeur de la valeur de pixel correspondante et conservez-la, supprimant ainsi la partie lumineuse
from PIL import ImageChops,Image
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
out=ImageChops.darker(im1,im2)
out.show()
(4) L'image devient plus claire
ImageChops.lighter (im1, im2)
Comparez les pixels des deux images, prenez la plus grande valeur de la valeur de pixel correspondante et conservez-la, afin de supprimer la partie sombre
from PIL import ImageChops,Image
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
out=ImageChops.lighter(im1,im2)
out.show()
(5) Fonction d'écran
ImageChops.screen (im1, im2)
Inversez d'abord la couleur puis superposez, comme pour projeter deux diapositives sur un écran avec deux projecteurs
Formule de calcul:
out = MAX - ((MAX-im1) * (MAX-im2) / MAX)
from PIL import ImageChops,Image
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
out=ImageChops.screen(im1,im2)
out.show()
(6) Fonction de couleur inverse
ImageChops.invert (im1)
Formule de calcul: out = 255-im1
from PIL import ImageChops,Image
im1=Image.open('kiki.jpg')
out=ImageChops.invert(im1)
out.show()
(7) Fonction de comparaison
ImageChops.difference (im1, im2)
Faire une opération de soustraction pour prendre une valeur absolue
Formule de calcul:
abs (im1-im2)
from PIL import ImageChops,Image
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
out=ImageChops.difference(im1,im2)
out.show()
Module ImageEnhance (amélioration d'image)
Instructions:
image_enhance = ImageEnhance.XXX (img) (Obtenir le réglage XXX)
im = image_enhance.enhance (0 ~ 2) 0 ~ 1 affaiblir, 1 ~ 2 renforcer
(1) Obtenez le régleur de couleur
ImageEnhance.Color (im)
(2) Obtenez le réglage du contraste
ImageEnhance.Contrast (im)
(3) Obtenez le réglage de la luminosité
ImageEnhance.Brightness (im)
(4) Obtenir le réglage de la netteté
ImageEnhancd.Sharpness (im)
from PIL import ImageEnhance,Image
im1=Image.open('kiki.jpg')
im1.thumbnail((im1.size[0]/3,im1.size[1]/3))
w,h=im1.size
out=Image.new('RGB',(3*w,4*h))
#获取色彩调整器对象
im_color=ImageEnhance.Color(im1)
im_color_a=im_color.enhance(1.5)
im_color_b=im_color.enhance(0.5)
#获取对比度调整器对象
im_contrast=ImageEnhance.Contrast(im1)
im_contrast_a=im_contrast.enhance(1.5)
im_contrast_b=im_contrast.enhance(0.5)
#获取亮度调整器对象
im_brightness=ImageEnhance.Brightness(im1)
im_brightness_a=im_brightness.enhance(1.5)
im_brightness_b=im_brightness.enhance(0.5)
#获取锐度调整器对象
im_sharpness=ImageEnhance.Sharpness(im1)
im_sharpness_a=im_sharpness.enhance(1.7)
im_sharpness_b=im_sharpness.enhance(0.2)
out.paste(im1,(0,0))
out.paste(im_color_a,(w,0))
out.paste(im_color_b,(2*w,0))
out.paste(im1,(0,h))
out.paste(im_contrast_a,(w,h))
out.paste(im_contrast_b,(2*w,h))
out.paste(im1,(0,2*h))
out.paste(im_brightness_a,(w,2*h))
out.paste(im_brightness_b,(2*w,2*h))
out.paste(im1,(0,3*h))
out.paste(im_sharpness_a,(w,3*h))
out.paste(im_sharpness_b,(2*w,3*h))
out.show()
Module C.ImagDraw (dessin d'image)
Instructions:
drawObject = ImageDraw.Draw (vide)
Fonction: dessiner une image bidimensionnelle
from PIL import Image, ImageDraw
img = Image.new('RGBA', (200, 200), 'white')
idraw = ImageDraw.Draw(img)
idraw.rectangle((10, 10, 100, 100), fill='blue')
img.save('D:\\rectangle.png')
D. Module ImagFont
Fonction: fonction de code de vérification
# -*- coding: utf-8 -*-
# __author__: Pad0y
from PIL import Image, ImageDraw, ImageFont
from random import choice, randint, randrange
import string
# 候选字符集,大小写字母+数字
chrs = string.ascii_letters + string.digits
def selected_chrs(length):
"""
返回length个随机字符串
:param length:
:return:
"""
result = ''.join(choice(chrs) for _ in range(length))
return result
def get_color():
"""
设置随机颜色
:return:
"""
r = randint(0, 255)
g = randint(0, 255)
b = randint(0, 255)
return (r, g, b)
def main(size=(200, 100), chrNumber=6, bgcolor=(255, 255, 255)):
"""
定义图片大小,验证码长度,背景颜色
:param size:
:param chrNumber:
:param bgcolor:
:return:
"""
# 创建空白图像和绘图对象
image_tmp = Image.new('RGB', size, bgcolor)
draw = ImageDraw.Draw(image_tmp)
# 生成并计算随机字符的宽度和高度
text = selected_chrs(chrNumber)
font = ImageFont.truetype('c:\\windows\\fonts\\simkai.ttf', 48) # 选定一款系统字体
width, height = draw.textsize(text, font)
if width + 2*chrNumber > size[0] or height > size[1]:
print('Size Error!')
return
# 绘制字符串
startX = 0
width_eachchr = width // chrNumber # 计算每个字符宽度
for i in range(chrNumber):
startX += width_eachchr + 1
position = (startX, (size[1]-height)//2+randint(-10, 10)) # 字符坐标, Y坐标上下浮动
draw.text(xy=position, text=text[i], font=font, fill=get_color()) # 绘制函数
# 对像素位置进行微调,实现验证码扭曲效果
img_final = Image.new('RGB', size, bgcolor)
pixels_final = img_final.load()
pixels_tmp = image_tmp.load()
for y in range(size[1]):
offset = randint(-1, 0) # randint()相当于闭区间[x,y]
for x in range(size[0]):
newx = x + offset # 像素微调
if newx >= size[0]:
newx = size[0] - 1
elif newx < 0:
newx = 0
pixels_final[newx, y] = pixels_tmp[x, y]
# 绘制随机颜色随机位置的干扰像素
draw = ImageDraw.Draw(img_final)
for i in range(int(size[0]*size[1]*0.07)): # 7%密度的干扰像素
draw.point((randrange(size[0]), randrange(size[1])), fill=get_color()) # randrange取值范围是左开右闭
# 绘制随机干扰线,这里设置为8条
for i in range(8):
start = (0, randrange(size[1]))
end = (size[0], randrange(size[1]))
draw.line([start, end], fill=get_color(), width=1)
# 绘制随机弧线
for i in range(8):
start = (-50, -50) # 起始位置在外边看起来才会像弧线
end = (size[0]+10, randint(0, size[1]+10))
draw.arc(start+end, 0, 360, fill=get_color())
# 保存图片
img_final.save('Veri_code.jpg')
img_final.show()
if __name__ == '__main__':
main((200, 100), 6, (255, 255, 255))