静态图像类型

矢量(Vector)图

用数学公式描述的图像,用一系列绘图指令表示图像:图像中每个形状都用一个完整的公式描述,称为一个对象。

  • 优点:

    • 文件数据量很小:
    • 图像质量与分辨率无关:无论图像放大或缩小多少倍,总是以显示设备允许的最大清晰度显示。
      计算机计算与显示图像时,往往能看到画图的过程。
  • 缺点:

    • 不易制作色调丰富或色彩变化太多的图像;
    • 绘出来的图像不是很逼真;
    • 不易在不同的软件间交换文件。

位图(Bitmap)

通过像素点表示图像,每个像素具有颜色属性和位置属性。

  • 优点:
    • 显示速度快;
    • 真实世界的图像可以通过扫描仪、数码相机、摄像机等设备方便的转化为点位图。
  • 缺点:
    • 存储和传输时数据量比较大;
    • 缩放、旋转时算法复杂且容易失真。
  1. 线画稿(LineArt)
    只有黑白两种颜色。适合于由黑白两色构成而没有灰度阴影的图像
  2. 灰度图像(GrayScale)
    从技术上说,就是具有从黑到白的若干种灰度的单色图像。若灰度图像像素的灰度级用8bit表示,则每个像素都是介于黑色和白色之间的256(2*=256)种灰度中的一种。通常所说的黑白照片,其实包含了黑白之间的所有灰度色调。

灰度图像是除了黑白之外,还添加了第三种颜色:灰色,灰色把灰度划分为 256 个不同的亮度,例如纯白色,它的亮度级别是255。

图像转化为灰度图像有以下几种算法:

浮点算法:Gray = R * 0.3 + G * 0.59 + B * 0.11
整数方法:Gray = ( R * 30 + G * 59 + B * 11 ) / 100
移位方法:Gray = ( R * 76 + G * 151 + B * 28 ) >> 8
平均值法:Gray = ( R + G + B ) / 3
仅取绿色:Gray = G
加权平均值算法:R = G = B = R * 0.299 + G * 0.587 + B * 0.144

  1. 二值图像 (Binary Image)
    二值图像是取值只有0和1的逻辑数组

  2. 索引颜色图像(Index Color)
    索引颜色通常也称为映射颜色。在这种模式下,颜色是一组预先定义的、有限的颜色。索引颜色的图像最多只能显示256种颜色。索引颜色图像在图像文件里定义索引颜色。打开该文件时,构成该图像具体颜色的索引值就被读入程序里,然后根据索引值找到最终的颜色。

  3. 伪彩色图像(Pseudo-color)
    我们知道可以观察出颜色的光的波长范围是有限的,仅仅有那么一小段,换句话说也就是说有一大段光,仅仅有一小段有颜色。
    其它都是灰度的,但人类视觉有一个特点就是,仅仅能分辨出二十几种灰度,也就是说採集到的灰度图像分辨率超级高。有一千个灰度级,但非常遗憾。
    人们仅仅能看出二十几个,也就是说信息损失了五十倍,但人类视觉对彩色的分辨能力相当强,可以分辨出几千种色度。
    在从採集的角度说下伪彩和真彩色,伪彩色原始图像是灰度图像

  4. 真彩色图像(True Color) 对应的还有
    自然界中几乎所有颜色都可以由红、绿、蓝(R,G,B)组合而成。真彩色图像中,每一个像素由红、绿和蓝三个字节组成,每个字节为8bit,表示0到255之间的不同的亮度值。256×256×256,能表示约1670万种颜色。颜色深度为每像素24位的数字图像是目前所能获取、浏览和保存的颜色信息最丰富的彩色图像,由于它所表达的颜色远远超出了人眼所能辨别的范围,故将其称为“真彩色”。

  • 常用颜色的RGB值
    白色:rgb(255,255,255)
    黑色:rgb(0,0,0)
    红色:rgb(255,0,0)
    绿色:rgb(0,255,0)
    蓝色:rgb(0,0,255)
    青色:rgb(0,255,255)
    紫色:rgb(255,0,255)
    调整相关数字,便可以得到深浅不一的各种颜色。
    ARGB:
    A = Alpha表示透明度
    FF - 不透明
    00 - 全透明

颜色样式

RGB数值

颜色代码

颜色样式

RGB数值

颜色代码

黑色

0,0,0

#000000

白色

255,255,255

#FFFFFF

象牙黑

88,87,86

#666666

天蓝灰

202,235,216

#F0FFFF

冷灰

128,138,135

#808A87

灰色

192,192,192

#CCCCCC

暖灰

128,118,105

#808069

象牙灰

251,255,242

#FAFFF0

石板灰

118,128,105

#E6E6E6

亚麻灰

250,240,230

#FAF0E6

白烟灰

245,245,245

#F5F5F5

杏仁灰

255,235,205

#FFFFCD

蛋壳灰

252,230,202

#FCE6C9

贝壳灰

255,245,238

#FFF5EE

红色

255,0,0

#FF0000

黄色

255,255,0

#FFFF00

镉红

227,23,13

#E3170D

镉黄

255,153,18

#FF9912

砖红

156,102,31

#9C661F

香蕉黄

227,207,87

#E3CF57

珊瑚红

255,127,80

#FF7F50

金黄

255,215,0

#FFD700

番茄红

255,99,71

#FF6347

肉黄

255,125,64

#FF7D40

粉红

255,192,203

#FFC0CB

粉黄

255,227,132

#FFE384

印度红

176,23,31

#B0171F

橘黄

255,128,0

#FF8000

深红

255,0,255

#FF00FF

萝卜黄

237,145,33

#ED9121

黑红

116,0,0

#990033

黑黄

85,102,0

#8B864E

绿色

0,255,0

#00FF00

棕色

128,42,42

#802A2A

青色

0,255,255

#00FFFF

土色

199,97,20

#C76114

黄绿色

127,255,0

#7FFF00

沙棕色

244,164,95

#F4A460

青绿色

64,224,205

#40E0D0

棕褐色

210,180,140

#D2B48C

青色

8,46,84

#082E54

玫瑰红

188,143,143

#BC8F8F

森林绿

34,139,34

#228B22

赫色

160,82,45

#A0522D

草绿色

107,142,35

#6B8E23

肖贡土色

199,97,20

#C76114

蓝色

0,0,255

#0000FF

肖贡土色

160,32,240

#A020F0

锰蓝

3,168,158

#03A89E

淡紫色

218,112,214

#DA70D6

深蓝

25,25,112

#191970

紫罗兰

138,43,226

#8A2BE2

土耳其蓝

0,199,140

#00C78C

胡紫色

153,51,250

#9933FA

RGB按1:1:1取值的时候是一个灰度图像

图像文件格式

图像文件的格式,即图像文件的数据构成。一般每种图像文件均有一个文件头,在文件头之后是图像数据。

  • 文件头:
    一般包括文件类型、文件制作者、制作时间、版本号、文件大小等内容。
    内容由制作该图像文件的公司决定。
  • 图像数据:
    各种图像文件的制作还涉及到图像文件的压缩方式和存储效率等。
    数字图像有多种存储格式,每种格式一般由不同的开发商支持。随着信息技术的发展和图像应用领域的不断拓宽,还会出现新的图像格式。
  • 图像文件格式体系
    • 互联网用:GIF、JPG、PNG
    • 印刷用:TIF、JPG、TAG、PCX
    • 国际标准:TIF、JPG
    • bmp(bitmap)文件:Windows 位图可以用任何颜色深度(从黑白到 24 位颜色)存储单个光栅图像。Windows 位图文件格式与其他 Microsoft Windows 程序兼容。它不支持文件压缩,也不适用于 Web 页。优点:BMP 支持 1 位到 24 位颜色深度。

色彩深度(Color Depth,简称色深)/位分辨率(Bit Resolution)

色彩深度(Color Depth,简称色深),是用 位(bit)数来表示数码影像色彩数目的单位。
色彩深度越高,可用的颜色就越多,颜色之间的过渡更自然和平滑。
像素深度越深,所占用的存储空间越大。
相反,如果像素深度太浅,那也影响图像的质量,图像看起来让人觉得很粗糙和很不自然。

指每个像素所用的位数(bit),像素位决定了彩色图像的每个像素可能的颜色数,或者确定灰度图像每个像素可能有的灰度级数。例如,一个彩色图像的每个像素用R,G,B,三个分量来表示,如每个分量用8位,那么一个像素用24位表示,就说这个像素的深度是24

位深度计算是以2为底数的指数的幂。常见的有:

  • 1位:2种颜色,单色光,黑白二色,用于compact Macintoshes。
  • 2位:4种颜色,CGA,用于gray-scale早期的NeXTstation及color Macintoshes。
  • 3位:8种颜色,用于大部分早期的电脑显示器。
  • 4位:16种颜色,用于EGA及不常见及在更高的分辨率的VGA标准,color Macintoshes。
  • 5位:32种颜色,用于Original Amiga chipset。
  • 6位:64种颜色,用于Original Amiga chipset。
  • 7位:128种颜色
  • 8位:256种颜色,用于最早期的彩色Unix工作站,低分辨率的VGA,Super VGA,AGA,color Macintoshes。
    灰阶,有256种灰色(包括黑白)。若以24位模式来表示,则RGB的数值均一样,例如(200,200,200)。
    彩色图像,若以24位模式来表示,则RGB的数值均一样,例如(200,200,200)。就是常说的24位真彩,约为1670万色。
  • 9位:512种颜色
  • 10位:1024种颜色,
  • 12位:用于部分硅谷图形系统,Neo Geo,彩色NeXTstation及Amiga系统于HAM mode。
  • 16位:用于部分color Macintoshes( 红色占5 个位、蓝色占 5 个位、绿色占 6 个位,所以红色、蓝色、绿色各有 32、32、64 种明暗度的变化总共可以组合出 64K 种颜色 )。
  • 24位:有16,777,216色,真彩色,能提供比肉眼能识别更多的颜色,用于拍摄照片。
  • 32位:基于24位而生,增加8个位的Alpha通道。

python代码

# 图像处理第一课
"""
图像属性:
分辨率:400*400
宽度:400px
高度:400px
水平分辨率: 96 dpi
垂直分辨率: 96 dpi
位深度:24
分辨率单位:2

dpi:图像每英寸长度内的像素点数。DPI(Dots Per Inch,每英寸点数)
如果你的显示设备dpi值高,那么你显示的图片就小,如果你的dpi值非常低,那么显示的图片实际尺寸就非常大。
但是不管怎么样设置,并不影响你的文件的实际大小,不影响图片的实际大小。
"""


def pil_demo01():
    # https://pillow.readthedocs.io/en/stable/
    from PIL import Image
    import matplotlib.pyplot as plt

    img = Image.open("./img/lena.jpg")
    print(img.format, img.size, img.mode)
    # img需要转换像素点数组
    import numpy as np
    img_array = np.array(img)

    print(img_array[100, 100])  # RGB
    r = img_array[100, 100, 0]
    g = img_array[100, 100, 1]
    b = img_array[100, 100, 2]
    print(r)
    print(g)
    print(b)

    print(img_array.shape)  # (400,400,3) 3代表三维数组 r,g,b

    plt.figure()  # 图形
    plt.subplot(2, 2, 1)  # 将画板分为2行两列,本幅图位于第一个位置
    plt.imshow(img)
    # 转成灰度图
    # img.convert('L').save("./img/lena1.jpg",dpi=(300.0,300.0), quality = 95)
    plt.subplot(2, 2, 2)  # 将画板分为2行两列,本幅图位于第二个位置
    plt.imshow(img.convert('L'))
    # 二值化
    # img.convert('1').save("./img/lena2.jpg")
    plt.subplot(2, 2, 3)  # 将画板分为2行两列,本幅图位于第3个位置
    plt.imshow(img.convert('1'))
    plt.show()


def cv2_demo01():
    # opencv默认是BGR 而PIL是RGB
    # https://docs.opencv.org/master/d3/df2/tutorial_py_basic_ops.html
    import cv2
    import matplotlib.pyplot as plt
    # img 为图像像素点数组(<class 'numpy.ndarray'>)
    img = cv2.imread('./img/lena.jpg')
    # img = cv.imread(文件名,[,参数])
    # 第二个参数是一个标志,它指定了读取图像的方式。
    # cv.IMREAD_COLOR: 加载彩色图像,任何图像的透明度都会被忽视,如果不传参数,这个值是默认值。
    # cv.IMREAD_GRAYSCALE:以灰度模式加载图像。
    # cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
    # 这三个标志可以简化为 1 、 0 、 -1
    print(type(img)) # <class 'numpy.ndarray'>
    print(img.size)  # 总像素数
    print(img[100, 100])  # BGR
    b = img[100, 100, 0]
    g = img[100, 100, 1]
    r = img[100, 100, 2]
    r2 = img.item(100, 100, 2)
    print(b)
    print(g)
    print(r, r2)
    print(img.shape)
    # 也可以直接修改 值img[100,100] = [255,255,255]
    # or 只改变red的值 img.itemset((100,100,2),100)
    # 也可以取某一块 到另一块上去
    eye = img[180:220, 180:230]
    img[0:40, 0:50] = eye
    # 灰度图像
    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # 二值图像
    ret, binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
    plt.subplot(221), plt.imshow(img, 'gray'), plt.title('ORIGINAL')
    plt.subplot(222), plt.imshow(img_gray, 'gray'), plt.title('img_gray')
    plt.subplot(223), plt.imshow(binary, 'gray'), plt.title('binary')
    plt.show()
    # plt.imshow(img)
    # plt.show()
    # 拆分通道
    b, g, r = cv2.split(img)
    # or
    # b = img[:,:,0]
    # set 单通道
    # img[:,:,2] = 0
    # 合成一张新图 完成 BGR 至 RGB 的转换
    img1 = cv2.merge((r, g, b)) # 注意rgb的顺序
    # or 完成 BGR 至 RGB 的转换
    #img3 = img[:, :, ::-1]
    # or 完成 BGR 至 RGB 的转换
    #img4 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # 图片写入
    #cv2.imwrite("demo.jpg", img1)
    plt.imshow(img1)
    plt.show()

    # cv2.imshow("img", img)
    # cv2.waitKey(0)
    # cv.waitKey(delay)是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。
    # 如果您在这段时间内按下任何键,程序将继续运行。如果 0 被传递,它将无限期地等待一次敲击键。
    # cv2.destroyAllWindows()

    BLUE = [255, 0, 0]
    # 复制
    replicate = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_REPLICATE)
    # 边框将是边框元素的镜像,例如:fedcba | abcdefgh | hgfedcb
    reflect = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_REFLECT)
    # 与上述相同,但略有变化,例如:gfedcb | abcdefgh | gfedcba
    reflect101 = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_REFLECT_101)
    # 无法解释,它看起来像这样:cdefgh | abcdefgh | abcdefg
    wrap = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_WRAP)
    # 添加恒定的彩色边框。 该值应作为下一个参数给出。
    constant = cv2.copyMakeBorder(img1, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=BLUE)
    plt.subplot(231), plt.imshow(img1, 'gray'), plt.title('ORIGINAL')
    plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
    plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
    plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
    plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
    plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
    plt.show()



if __name__ == '__main__':
    pil_demo01()
    cv2_demo01()

"""
https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#fully-supported-formats

https://pillow.readthedocs.io/en/stable/handbook/concepts.html
图像的模式定义了图像中像素的类型和深度。
每个像素使用比特深度的全范围。
1位像素的范围是0-1,8位像素的范围是0-255,以此类推。
im.mode 有以下标准模式:
1 (1-bit pixels, black and white, stored with one pixel per byte)
L (8-bit pixels, black and white)
P (8-bit pixels, mapped to any other mode using a color palette)
RGB (3x8-bit pixels, true color)
RGBA (4x8-bit pixels, true color with transparency mask)
CMYK (4x8-bit pixels, color separation)
YCbCr (3x8-bit pixels, color video format)
Note that this refers to the JPEG, and not the ITU-R BT.2020, standard
LAB (3x8-bit pixels, the L*a*b color space)
HSV (3x8-bit pixels, Hue, Saturation, Value color space)
I (32-bit signed integer pixels)
F (32-bit floating point pixels)
特殊模式:
LA (L with alpha)
PA (P with alpha)
RGBX (true color with padding)
RGBa (true color with premultiplied alpha)
La (L with premultiplied alpha)
I;16 (16-bit unsigned integer pixels)
I;16L (16-bit little endian unsigned integer pixels)
I;16B (16-bit big endian unsigned integer pixels)
I;16N (16-bit native endian unsigned integer pixels)
BGR;15 (15-bit reversed true colour)
BGR;16 (16-bit reversed true colour)
BGR;24 (24-bit reversed true colour)
BGR;32 (32-bit reversed true colour)
"""

posted on 2020-05-23 14:20  kingreatwill  阅读(2514)  评论(0编辑  收藏  举报