翼度科技»论坛 编程开发 python 查看内容

python学习_PIL的Image模块初步使用

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
基本介绍:

Pillow 是 Python 中较为基础的图像处理库,主要用于图像的基本处理,比如裁剪图像、调整图像大小和图像颜色处理等。与 Pillow 相比,OpenCV 和 Scikit-image 的功能更为丰富,所以使用起来也更为复杂,主要应用于机器视觉、图像分析等领域,比如众所周知的“人脸识别”应用 。
Image模块:
Image模块是PIL最基本的模块,其中导出了Image类,一个Image类实例对象就对应了一副图像。同时,Image模块还提供了很多有用的函数。
本文只是初步学习了一些用法与实际操作。
基础函数:

函数名简介open()打开图片save("test.gif","GIF")保存(新图片路径和名称,保存格式)show()显示图片size是img图片对象的成员数据,是一个元组,包含了像素宽度和像素高度Image.new()生成新的图片getpixel((1,1))获取像素点(1,1)三通道信息putpixel()设置像素点三通道信息基础运用:

加载图片
  1. from PIL import Image       
  2. pic=Image.open('test.jpg')        #打开图片:打开'test.jpg',将文件数据返给img图片对象
  3. pic.show()        #显示pic中的图片内容
  4. x,y=pic.size  #获取图片的像素宽度与高度
  5. print(x*y)        #获取图片的像素点数
复制代码
遍历img图片的每一个像素并操作的程序框架
  1. x,y = img.size
  2. for i in range(x):
  3.     for j in range(y):
复制代码
img图片对象是三通道的,每个像素点包含红、绿、蓝三种通道的信息。
img.getpixel()接受一个包含像素点坐标的元组作为传入参数,并传回该点的三通道值。注意传入的是元组,所以不要漏写函数接口括号和元组本身的括号
例如img.getpixel((12,12))就代表了(12,12)的像素点的三通道信息
编辑图片

pic = Image.new() 生成新的图片对象pic(传入两个参数,第一个是模式字符串(‘L’是8位像素黑白灰色,'RGB'是真彩色),第二个是大小元组)
  1. pic = Image.new('L', (80, 100))
  2. pic=Image.new("RGB",(MAX,MAX))
复制代码
pic.putpixel()设置像素点的三通道信息(传入两个参数,第一个是坐标元组,第二个是颜色,单通道颜色是一个数值(0是黑色),多通道颜色是一个元组)
  1. L: pic.putpixel((i, j), 0)
  2. RGB: pic.putpixel([x,y],(0,0,0))
复制代码
实例:

0 1转化为二维码
  1. from PIL import Image
  2. MAX = 25        #数字的长度为一个整数的平方(如25^2=625,因为01的总数量为625)
  3. pic = Image.new("RGB",(MAX, MAX))
  4. str = "1111111000100001101111111100000101110010110100000110111010100000000010111011011101001000000001011101101110101110110100101110110000010101011011010000011111111010101010101111111000000001011101110000000011010011000001010011101101111010101001000011100000000000101000000001001001101000100111001111011100111100001110111110001100101000110011100001010100011010001111010110000010100010110000011011101100100001110011100100001011111110100000000110101001000111101111111011100001101011011100000100001100110001111010111010001101001111100001011101011000111010011100101110100100111011011000110000010110001101000110001111111011010110111011011"
  5. i=0
  6. for y in range(MAX):
  7.     for x in range(MAX):
  8.         if str[i]=='1':
  9.             pic.putpixel([x,y],(0,0,0))
  10.         else:
  11.             pic.putpixel([x,y],(255,255,255))
  12.         i+=1
  13. pic.save('out.png')
复制代码
像素点三通道信息转二维码

同样的思想,先转01,再转图片
  1. qr.txt部分内容
  2. (0, 0, 0)
  3. (0, 0, 0)
  4. (0, 0, 0)
  5. (255, 255, 255)
  6. (255, 255, 255)
复制代码
  1. from PIL import Image
  2. pixel = open('qr.txt','r').readlines();
  3. res = "";
  4. for i in pixel:
  5.     i = i.strip('\n')   #strip()方法用于移除字符串头部、尾部指定字符
  6.     # print(i)
  7.     if i == "(255, 255, 255)":
  8.         res += '1';
  9.     elif i == "(0, 0, 0)":
  10.         res += '0';
  11. n=0
  12. MAX=200
  13. pic = Image.new("RGB",(MAX, MAX))
  14. for y in range(MAX):
  15.     for x in range(MAX):
  16.         if res[n]=='1':
  17.             pic.putpixel([x,y],(255,255,255))
  18.         else:
  19.             pic.putpixel([x,y],(0,0,0))
  20.         n+=1
  21. pic.save('input.png','png')
复制代码
结合itertools更便捷
  1. import itertools
  2. from PIL import Image
  3. max = 200
  4. file = open("qr.txt", "r")
  5. img = Image.new("RGB", (max, max))
  6. for y, x in itertools.product(range(max), range(max)):
  7.     pixel = eval(file.readline())        #将字符串当成有效的表达式来求值,并返回计算结果
  8.     img.putpixel([x, y], pixel)
  9. img.save('input.png','png')
复制代码
解释:
  1. itertools.product():以元组的形式,根据输入的可遍历对象生成笛卡尔积
  2. 实例:
  3. import itertools
  4. max=3
  5. for x,y in itertools.product(range(max),range(max)):
  6.     print(x,y)
  7. result:
  8. 0 0
  9. 0 1
  10. 0 2
  11. 1 0
  12. 1 1
  13. 1 2
  14. 2 0
  15. 2 1
  16. 2 2
复制代码
来源:https://www.cnblogs.com/Mar10/p/17044844.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具