summer14

python图像处理库

pillow是python图像处理的第三方库,可以对图片进行加载、显示、保存、剪切、黏贴、分离、合并等操作。

Pillow基本使用

新建一张图片
im = Image.new("RGBA", (width, height))

加载图片
im = Image.open('Mycat.jpg')
显示图片
im.show()
另存为其他格式
im.save("Mycat.png")
图片剪切 box
= (x1, y1 ,x2, y2) #图片左上角是坐标原点,横轴为x,纵轴为y,x2>=x1,y2>=y1 im.crop(box)       #剪切出来的图片是各点划线所围的矩形 图片粘贴(一张图片覆盖到另一张图上面) im2 = Image.open("Mydog.jpg") im.paste(im2) #把im2贴到im上 处理gif im = Image.open("Mypig.gif") im.tell() #显示当前帧数 im.seek(1) #移动到指定帧 im.show() 读取像素值,色深可以为1,8,24,32位 im.getpixel((x, y))    #图片左上角是坐标原点,横轴为x,纵轴为y 修改像素值 im.putpixel((x, y), (0, 0, 0))    #rgb(0, 0, 0),黑色,24位色深

 

取出GIF每一帧,合成为新的图片

gif把完整的图片细分成很多小的切片。

  

先取出gif的每一帧,存放在指定目录里

#!/usr/bin/env python3

from PIL import Image

gif = Image.open("glance.gif")
gif.save(f"frame/{gif.tell()}.png")
while True:
        gif.seek(gif.tell() + 1)
        gif.save(f"frame/{gif.tell()}.png")

得到201张,每张宽高为2*600的图片。  

  

新建一张图片,把每一帧依次覆盖在新的图片上。

#!/usr/bin/env python3

from PIL import Image

im = Image.new("RGBA", (402, 600))

w = 0
for i in range(201):
    gif = Image.open(str(i) + ".png")
    box = (w, 0, w+2, 600)
    im.paste(gif, box)
    w += 2
im.show()

 

获取图片RGB

104张黑白图片,考察01比特流。

  

im.getpixel((0,0))查看每张图片第一个像素点,可以看到白色图片第一个像素点RGB=(255, 255, 255),黑色图片第一个像素点RGB=(12, 12, 0)。

  

 不知道黑色和白色哪个代表0或1,两种情况都试试

#!/usr/bin/env python3

from PIL import Image
import binascii

streamA = ''
streamB = ''
for i in range(104):
    im = Image.open("gif/" + str(i) + ".jpg")
    if(im.getpixel((0,0))[0] == 255):
        streamA += '1'
        streamB += '0'
    else:
        streamA += '0'
        streamB += '1'

#每8位二进制数为一个字节,二进制转为十进制,十进制转为ascii streamA_ascii
= [chr(int(streamA[i:i+8], 2)) for i in range(0, len(streamA), 8)] streamB_ascii = [chr(int(streamB[i:i+8], 2)) for i in range(0, len(streamB), 8)] print("".join(streamA_ascii)) print("".join(streamB_ascii))

  

 

最低有效位

题目:最低位的亲吻

获得一个8位色深的图片。

   

处理思路:像素最低位为1时,像素取值为255;像素最低位为0时,像素取值为0。

#!/usr/bin/env python3

from PIL import Image

im = Image.open("01.png")
width,height = im.size
for i in range(width):
    for j in range(height):
        if im.getpixel((i, j)) & 0x1 == 1:
            im.putpixel((i, j), 255)
        else:
            im.putpixel((i, j), 0)
im.show()

得到隐写的二维码 

 

 

posted on 2023-05-02 21:26  summer14  阅读(140)  评论(0编辑  收藏  举报

导航