Python3統合枕

1.枕を取り付けます

pip install pillow

2.画像​​処理の概要

画像処理RGBカラーモード:

-R(赤)0--255

-G(緑)0--255

-B(青)0--255

ピクセル配列

各ポイントはピクセルです。各ポイントは(R、G、B)の色で表されます。

画像素材:

 

yoki.jpg

kiki.jpg

niki.jpg

3.モジュールの紹介

A.Image模块

(1)画像を開く

例:画像付きの画像を開く

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

①透明ブレンド

ブレンド(im1、im2、alpha)

im1:画像1、im2:画像2、アルファブレンディングの透明度(0-1)はim2の比率です

注:im1とim2のサイズは同じである必要があります

特定の混合式: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()

混合結果

 

yoki+kiki

②マスクブレンド

コンポジット(im1、im2、マスク)

機能:マスクを使用して、im1とim2を一緒に処理します。im1、im2、およびマスクの3つの画像は、同じサイズである必要があります。

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

 結果:

(3)画像ズーム

①ピクセルズーム(実際には、明るさの調整):

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

結果:

②サイズスケーリング(サイズ変更):

#导入模块
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)貼り付けてカットする

①貼り付け:

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

im:ソース画像またはピクセル値;ボックス:貼り付け領域;マスク:マスク

ボックス:

a。(x1、y1):画像の左上隅(x1、y1)を揃え、貼り付けた画像領域を超えて破棄します

b。(x1、y1、x2、y2):元の画像はこの領域と一致しています。

c。なし:元の画像と貼り付けた画像のサイズは同じである必要があります。

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

 結果:

 

(5)画像の回転

Image.rotate(angle、resample = 0、expand = 0、center = None、translate = None、fillcolor = None)

角度:回転角

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

(6)フォーマット変換

#导入模块
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)画像の分離(分割)、混合(マージ)

#导入模块
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)画像フィルター

BLUR:ブラーフィルタリング

CONTOUR:輪郭フィルター

詳細:詳細フィルタリング

EDGE_ENHANCE:境界拡張フィルタリング

EDGE_ENHANCE_MORE:境界拡張フィルタリング(より深い)

EMBOSS:レリーフフィルター

FIND_EDGES:境界フィルタリングを見つける

SMOOTH:スムージングフィルター

SMOOTH_MORE:平滑化フィルター(より深い)

シャープ:シャープフィルター

GaussianBlur(radius = 2):ガウスぼかし

例:

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

結果:

もう学びたくない、ゲームをするつもり、2日で続ける

立ち止まるな

(8)画像全体の操作

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

 

 

B.ImageChopsモジュール

(1)写真を追加する

ImageChops.add(im1、im2、scale = 1.0、offset = 0)

計算式:

out =((im1 + im2)/ scale + offset)

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)画像の減算

ImageChops.subtract(im1、im2、scale = 1.0、offset = 0)

計算式:

out =((im1-im2)/ scale + offset)

(3)画像が暗くなる

ImageChops.darker(im1、im2)

2つの画像のピクセルを比較し、対応するピクセル値の小さい方の値を取得して保持し、明るい部分を削除します

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

(4)画像が明るくなる

ImageChops.lighter(im1、im2)

2つの画像のピクセルを比較し、対応するピクセル値の大きい方の値を取得して保持し、暗い部分を削除します

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

(5)画面機能

ImageChops.screen(im1、im2)

2台のプロジェクターで2台のスライドを1つのスクリーンに投影するのと同じように、最初に色を反転してから重ね合わせます。

計算式:

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)逆色関数

ImageChops.invert(im1)

計算式:out = 255-im1

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

(7)比較機能

ImageChops.difference(im1、im2)

減算演算を実行して絶対値を取得します

計算式:

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. ImageEnhanceモジュール(画像エンハンスメント)

指示:

image_enhance = ImageEnhance.XXX(img)(XXXアジャスターを取得)

im = image_enhance.enhance(0〜2)0〜1弱く、1〜2強める

(1)カラーアジャスターを入手する

ImageEnhance.Color(im)

(2)コントラストアジャスターを入手する

ImageEnhance.Contrast(im)

(3)明るさ調整器を入手する

ImageEnhance.Brightness(im)

(4)シャープネスアジャスターを入手する

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

 

C.ImagDrawモジュール(画像描画)

指示:

drawObject = ImageDraw.Draw(blank)

機能:二次元画像を描く

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.ImagFontモジュール

機能:検証コード機能

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

おすすめ

転載: blog.csdn.net/zhouzhiwengang/article/details/112760729