Almohada Python3 integrada

1. Instale la almohada

pip install pillow

2. Introducción al procesamiento de imágenes

Modo de color RGB de procesamiento de imágenes:

-R (rojo) 0-255

-G (verde) 0-255

-B (azul) 0-255

Matriz de píxeles

Cada punto es un píxel. Cada punto está representado por el color (R, G, B)

Material de imagen:

 

yoki.jpg

kiki.jpg

niki.jpg

3. Introducción al módulo

A. Modelo de imagen

(1) Abra la imagen

Ejemplo: abrir una imagen con imagen

#导入模块
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) Mixto

① Mezcla de transparencias

mezcla (im1, im2, alpha)

im1: imagen 1, im2: imagen 2, transparencia de mezcla alfa (0-1) es la proporción de im2

Nota: el tamaño de im1 e im2 debe ser el mismo

Fórmula de mezcla específica: 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()

Resultados mixtos

 

yoki + kiki

② Mezcla de mascarillas

compuesto (im1, im2, máscara)

Función: Use máscara para procesar im1 e im2 juntos. Las tres imágenes de im1, im2 y máscara deben tener el mismo tamaño.

#导入模块
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()

 resultado:

(3) Zoom de imagen

① Zoom de píxeles (de hecho, ajuste de brillo):

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
#将每个像素值扩大2倍
img1_mul2=Image.eval(img1,lambda x:x*2)
#显示图片
img1_mul2.show()

resultado:

② Escala de tamaño (cambiar tamaño):

#导入模块
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) Pegar y cortar

①Pegar:

Image.paste (im, box = None, mask = None)

im: imagen de origen o valor de píxel; cuadro: área de pegado; máscara: máscara

caja:

a. (x1, y1): alinee la esquina superior izquierda de la imagen (x1, y1) y descarte más allá del área de la imagen pegada

b. (x1, y1, x2, y2): la imagen original es coherente con esta área.

c. Ninguno: la imagen original y la imagen pegada deben tener el mismo tamaño.

#导入模块
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()

 resultado:

 

(5) Rotación de imagen

Image.rotate (ángulo, remuestrear = 0, expandir = 0, centro = Ninguno, trasladar = Ninguno, color de relleno = Ninguno)

ángulo: ángulo de rotación

#导入模块
from PIL import Image
#打开图片
img1=Image.open('kiki.jpg')
img1=img1.rotate(60)
img1.show()

(6) Conversión de formato

#导入模块
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) Separación de imágenes (dividir), mezclar (fusionar)

#导入模块
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) Filtro de imagen

BLUR : filtrado de desenfoque

CONTORNO : Filtro de contorno

DETALLE : filtrado de detalles

EDGE_ENHANCE : filtrado de mejora de límites

EDGE_ENHANCE_MORE : filtrado de mejora de límites (más profundo)

EMBOSS : Filtro de relieve

FIND_EDGES : Encuentra filtrado de límites

SMOOTH : filtro suavizante

SMOOTH_MORE : filtro de suavizado (más profundo)

SHARPEN : filtro de afilado

Desenfoque gaussiano (radio = 2) : Desenfoque gaussiano

Ejemplo:

#导入模块
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()

resultado:

No quiero aprender más, voy a jugar y continuaré en dos días

Sigue adelante

(8) Funcionamiento general de la imagen

from PIL import ImageEnhance,Image
 
im1=Image.open('kiki.jpg')
out=im1.point(lambda i:i*2)#图片整体变亮
out.show()

 

 

B. Módulo ImageChops

(1) Agregar imágenes

ImageChops.add (im1, im2, escala = 1.0, desplazamiento = 0)

Fórmula de cálculo:

out = ((im1 + im2) / escala + desplazamiento)

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) Resta de imágenes

ImageChops.subtract (im1, im2, escala = 1.0, desplazamiento = 0)

Fórmula de cálculo:

out = ((im1-im2) / escala + desplazamiento)

(3) La imagen se vuelve más oscura

ImageChops.darker (im1, im2)

Compare los píxeles de las dos imágenes, tome el valor más pequeño del valor de píxel correspondiente y guárdelo, eliminando así la parte brillante

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
 
out=ImageChops.darker(im1,im2)
out.show()

(4) La imagen se vuelve más brillante

ImageChops.lighter (im1, im2)

Compare los píxeles de las dos imágenes, tome el valor más grande del valor de píxel correspondiente y guárdelo para eliminar la parte oscura

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
im2=Image.open('niki.jpg')
 
out=ImageChops.lighter(im1,im2)
out.show()

(5) Función de pantalla

ImageChops.screen (im1, im2)

Primero invierta el color y luego superponga, similar a proyectar dos diapositivas en una pantalla con dos proyectores

Fórmula de cálculo:

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) Función de color inverso

ImageChops.invert (im1)

Fórmula de cálculo: out = 255-im1

from PIL import ImageChops,Image
 
im1=Image.open('kiki.jpg')
out=ImageChops.invert(im1)
out.show()

(7) Función de comparación

ImageChops.difference (im1, im2)

Realice la operación de resta para tomar valor absoluto

Fórmula de cálculo:

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

B. Módulo ImageEnhance (mejora de imagen)

Instrucciones:

image_enhance = ImageEnhance.XXX (img) (Obtener ajustador XXX)

im = image_enhance.enhance (0 ~ 2) 0 ~ 1 debilitar, 1 ~ 2 fortalecer

(1) Obtenga el ajustador de color

ImageEnhance.Color (im)

(2) Obtenga el ajustador de contraste

ImageEnhance.Contrast (im)

(3) Obtenga el ajustador de brillo

ImageEnhance.Brightness (im)

(4) Obtenga el ajustador de nitidez

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

 

Módulo C.ImagDraw (dibujo de imagen)

Instrucciones:

drawObject = ImageDraw.Draw (en blanco)

Función: dibujar una imagen bidimensional

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. Módulo ImagFont

Función: función de código de verificación

# -*- 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))

Supongo que te gusta

Origin blog.csdn.net/zhouzhiwengang/article/details/112760729
Recomendado
Clasificación