图像介绍
像素
图像通常由像素构成,每一个像素由三个距离很近的点构成,他们的颜色分别是红、绿、蓝。每个像素可由一个元组(r,g,b)表示,r、g、b通常为不超过255的整数。
图像的常见模式
RGB | 每个像素由红绿蓝三个分量表示 |
RGBA | 每个像素由红绿蓝加上透明度四个分量表示 |
CYMK | 每个像素由青色、洋红色、黄色、黑色四个分量表示,与彩色打印机、印刷机墨水相对应 |
L | 黑白图像,每个像素由一个整数表示,代表灰度 |
图片的储存
像素的大小
每个像素若以RGB模式储存,则需储存三个不超过255的整数r、g、b,一个这样的整数在计算机中通常是一个Byte(8bit),一个像素就需要24b。若以RGBA模式储存,则每个像素需四个用整数,需32b。
图片的y方向正立与倒立
图片为二维数据,数据在计算机内存中为一维储存,故图像的每个像素依次储存时需要一定的顺序。常见的有两种:按行储存,从上往下或从下往上。
y轴倒立
y轴倒立即为按行从上往下储存。如上图(图6)中,每个格子代表一个像素的内容,储存在计算机中的一维数据为(123456789)。坐标系原点在左上角,与计算机图形学相对应。
y轴正立
y轴正立即为按行从下往上储存。如上图(图6)中,每个格子代表一个像素的内容,储存在计算机中的一维数据为(789456124)。坐标系原点在左下角,与正常的数学坐标公式相对应。
RGB的储存顺序
上面介绍了像素与像素之间的储存顺序,同样每个像素之间的分量r、g、b自然也有储存顺序。据排列组合,RGB排列有6种。若是RGBA模式,则有24种。
图片的格式
图片的格式即为计算机储存图片的算法,如同zip、rar之于普通文件。常见的有jpeg、png等。
图片储存算法的必要性
一个1000*1000的24位图(RGB模式),直接储存的大小为1000*1000*24b=2.93MB,已经不是很小。所以需要这些针对于图片的压缩算法,在内存中不直接储存图像所有像素信息。写入时编码,读出时解码。
BMP
BMP格式未压缩像素格式,储存为文件头、图像头、像素数据。
JPEG
JPEG为有损压缩格式,无透明信息。一般用于储存相机拍摄的照片。JPEG文件会自带一个Exif信息,有图像大小、拍摄时间、位置等。
PNG
PNG是一种无损压缩格式,可以有透明效果。较适合矢量图、几何图。
GIF
GIF可以储存多帧图像,似乎多用于表情包。
WEBP
google开发的有损压缩格式,有透明信息。
关于安装和更新Python第三方库
Python生态中有巨多无比的第三方库,与标准库不同,这些第三方库在使用时需要下载和更新。
下载
一、进入cmd命令窗口
window可通过Win加R快捷键,再输入cmd进入。
二、进入安装Python的文件夹,默认通常是:
C;\Users\用户名\AppData\Local\Programs\Python\Python39
三、进入scripts文件夹
四、使用pip install 库名命令
注:通常略去二三步也行
如:
更新
如图2所示的黄色字体即为提醒更新。
一、pip list命令
该命令可获取所有已安装的第三方库。如:
二、pip list --outdated命令
该命令可获取所有可更新的库。如:
三、pip install --upgrade 库名命令
该命令可更新该库。如:
Pillow库
介绍
Pillow库是PIL(Python Imaging Library)的友好分支,作者是Alex Clark及其贡献者。而PIL是一个名气较大的Python图像处理库,作者是Fredrik Lundh及其贡献者,但由于只支持到Python2.7所以如今的Pillow比PIL更具活力。
常用函数(方法)及静态变量
open() | 打开一个Image |
resize() | 缩放 |
thumbnial() | 缩略图 |
save() | 保存 |
show() | 预览 |
totate() | 旋转 |
transpose() | 镜像 |
filter() | 过滤 |
crop() | 裁剪 |
paste() | 拼接 |
load() | 获得像素矩阵 |
split() | 分离 |
convert() | 改变模式 |
size | 长、宽 |
format | 格式 |
mode | 模式 |
应用
图片的缩放
主要函数:size、resize
from PIL import Image
#缩放操作
img=Image.open("D:/temp/xiamu1.jpeg")
print(img.size)
#(700,619)
newImg=img.resize((500,500))
newImg.save("D:/temp/xiamu1_500500.jpeg")
效果(左边原图、右边成图):
缩略图
主要函数:thumbnail
from PIL import Image
#缩略图
img=Image.open("D:/temp/xiamu1.jpeg")
img.thumbnail((500,500))
print(img.size)
#(500,442)
img.save("D:/temp/xiamu1_500500_2.jpeg")
效果:
resize与thumbnail的区别
一、resize()函数返回Image对象,thumbnail()返回None
二、resize()不会动原Image对象,thumbnail()直接改变原Image对象
三、resize()会改变原图长宽比,thumbnail()不会.如上例中,生成的图片长宽并非500*500而是500*442
图片的旋转
主要函数:rotate
from PIL import Image
#旋转操作
img=Image.open("D:/temp/xiamu1.jpeg")
newImg=img.rotate(45,expand=True) #True为逆时针
newImg.save("D:/temp/xiamu1_90.jpeg")
效果:
图片的镜像
主要函数:transpose
from PIL import Image
#左右镜像操作
img=Image.open("D:/temp/xiamu1.jpeg")
newImg=img.transpose(Image.FLIP_LEFT_RIGHT)
newImg.save("D:/temp/xiamu1_jin_zy.jpeg")
newImg=img.transpose(Image.FLIP_TOP_BOTTOM)
效果:
图片的过滤(滤镜)
主要函数:filter
from PIL import Image
from PIL import ImageFilter
img=Image.open("D:/temp/xiamu1.jpeg")
newImg=img.filter(ImageFilter.BLUR) #模糊
newImg.save("D:/temp/xiamu_fliter_blur.jpeg")
newImg=img.filter(ImageFilter.CONTOUR) #轮廓
newImg=img.filter(ImageFilter.EDGE_ENHANCE) #边缘
newImg=img.filter(ImageFilter.EMBOSS) #浮雕
效果:
图片的裁剪
主要函数:crop
from PIL import Image
img=open("D:/temp/xiamu1.jpeg")
newImg=img.crop((0,0,300,300))
newImg.save("D:/temp/xiamu1_300300.jpeg")
效果:
图片九宫格化
主要函数:crop、paste
from PIL import Image
img=Image.open("D:/temp/xiamu1.jpeg")
tu=img.size
w=tu[0]//3
h=tu[1]//3
gap=8
newImg=Image.new("RGB",(img.size[0]+gap*2,img.size[1]+gap*2),"white")
for i in range(3):
for j in range(3):
clipImg=img.crop((w*j,i*h,(j+1)*w,(i+1)*h))
newImg.paste(clipImg,(j*(w+gap),i*(h+gap)))
newImg.save("D:/temp/xiamu1_9.jpeg")
效果:
图片的素描化
主要函数:load、convert
from PIL import Image
def makeSketch(img,threshold): #转素描函数
w,h=img.size
img=img.convert("L")
pix=img.load()
for x in range(w-1):
for y in range(h-1):
if abs(pix[x,y]-pix[x+1,y+1])>=threshold:
pix[x,y]=0
else:
pix[x,y]=255
return img
img=Image.open("D:/temp/xiamu1.jpeg")
img=makeSketch(img,15)
img.save("D:/temp/xiamu1_skectch.jpeg")
效果:
图片加水印
from PIL import Image
def getMask(img,isTransparent,alpha):
if img.mode!="RGBA":
img=img.convert("RGBA")
w,h=img.size
pix=img.load()
for x in range(w):
for y in range(h):
p=pix[x,y]
if isTransparent(p[0],p[1],p[2]):
pix[x,y]=(p[0],p[1],p[2],0)
else:
pix[x,y]=(p[0],p[1],p[2],alpha)
r,g,b,a=img.split()
return a
img_1=Image.open("D:/temp/xiamu4.jpeg")
img=Image.open("D:/temp/xiamu1.jpeg")
img.resize(img_1.size)
mak=getMask(img,lambda r,g,b:r>150 and g>150 and b>150,130) #根据所用图片调整参数
img_1.paste(img,(img_1.size[0]-img.size[0],img_1.size[1]-img.size[1]),mask=mak)
img_1.save("D:/temp/xiamu_mask.jpeg")
效果: