图像介绍

像素

图像通常由像素构成,每一个像素由三个距离很近的点构成,他们的颜色分别是红、绿、蓝。每个像素可由一个元组(r,g,b)表示,r、g、b通常为不超过255的整数。

图像的常见模式

RGB

每个像素由红绿蓝三个分量表示

RGBA

每个像素由红绿蓝加上透明度四个分量表示

CYMK

每个像素由青色、洋红色、黄色、黑色四个分量表示,与彩色打印机、印刷机墨水相对应

L

黑白图像,每个像素由一个整数表示,代表灰度

图片的储存

像素的大小

每个像素若以RGB模式储存,则需储存三个不超过255的整数r、g、b,一个这样的整数在计算机中通常是一个Byte(8bit),一个像素就需要24b。若以RGBA模式储存,则每个像素需四个用整数,需32b。

图片的y方向正立与倒立

图片为二维数据,数据在计算机内存中为一维储存,故图像的每个像素依次储存时需要一定的顺序。常见的有两种:按行储存,从上往下或从下往上。

hsv python rgb颜色转换 python中rgb_Image

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进入。

hsv python rgb颜色转换 python中rgb_python_02


二、进入安装Python的文件夹,默认通常是:

C;\Users\用户名\AppData\Local\Programs\Python\Python39

三、进入scripts文件夹

四、使用pip install 库名命令

注:通常略去二三步也行

如:

hsv python rgb颜色转换 python中rgb_Python_03

更新

如图2所示的黄色字体即为提醒更新。

一、pip list命令

该命令可获取所有已安装的第三方库。如:

hsv python rgb颜色转换 python中rgb_Image_04


二、pip list --outdated命令

该命令可获取所有可更新的库。如:

hsv python rgb颜色转换 python中rgb_python_05


三、pip install --upgrade 库名命令

该命令可更新该库。如:

hsv python rgb颜色转换 python中rgb_Python_06

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

效果(左边原图、右边成图):

hsv python rgb颜色转换 python中rgb_Image_07

缩略图

主要函数: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")

效果:

hsv python rgb颜色转换 python中rgb_Python_08

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

效果:

hsv python rgb颜色转换 python中rgb_Image_09

图片的镜像

主要函数: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)

效果:

hsv python rgb颜色转换 python中rgb_python_10


hsv python rgb颜色转换 python中rgb_Image_11

图片的过滤(滤镜)

主要函数: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)			#浮雕

效果:

hsv python rgb颜色转换 python中rgb_python_12


hsv python rgb颜色转换 python中rgb_第三方库_13


hsv python rgb颜色转换 python中rgb_Image_14


hsv python rgb颜色转换 python中rgb_Image_15

图片的裁剪

主要函数: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")

效果:

hsv python rgb颜色转换 python中rgb_python_16

图片九宫格化

主要函数: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")

效果:

hsv python rgb颜色转换 python中rgb_第三方库_17

图片的素描化

主要函数: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")

效果:

hsv python rgb颜色转换 python中rgb_Image_18

图片加水印
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")

效果:

hsv python rgb颜色转换 python中rgb_第三方库_19