Oreiller intégré Python3

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:

 

yoki.jpg

kiki.jpg

niki.jpg

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

 

yoki + kiki

②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))

Je suppose que tu aimes

Origine blog.csdn.net/zhouzhiwengang/article/details/112760729
conseillé
Classement