数字图像处理pillow库

数字图像处理pillow库

1. 数字图像处理基本知识

之前学过,现在复习。。。

from PIL import Image
import tensorflow as tf 
from matplotlib import pyplot as plt 
import numpy as np 
import pandas as pd 

print("""
1.图像的离散化
    连续图像:就是人眼直接感受到的图像
    数字图像:把连续的图像数字化,离散化之后的图像,他是对连续图像的近似。
    就是把人眼看到的图片变成点阵式的图片,放大我们就可以看见点阵了。

2.基本概念
    像素:(Pixel)是图像中最小的单位
    位图:(bitmap)通过记录每一个像素值来存储和表达的图像
    色彩深度/位深度:位图中每个像素点要用多少个二进制位表示
    BMP:windows系统的标准位图格式。
3.二值图像(Binary Image)
    每个像素只有两种取值,使用1位二进制来表示,所以位深度是1。
    比如一个二值图像:是512*512,则大小是512*512bit = 1024*256bit=256k b =32k Byte
    所谓的图像二值化:就是将图像变为只有黑白两种颜色,0表示黑,255表示白。
    只有两种颜色,就可以说这个图片是二值图
4.灰度图像(gray image)
    每个像素只有一个字节,位图深度=8*1 bit=8位 所以可以表示的值为2^0~2^8-1 =0~255
    也就是说可以表示256种灰度级别。也叫光学强度
    0是黑色,255是白色,中间是各种灰度,255也叫光学强度最大的状态
5.彩色图像(RGB)
    1.每个像素都有红绿蓝三个分量:RGB
    2.一个像素值可以使用3个字节,所以是24位图深度
    表示的灰度级别即颜色种类有256*256*256 =16777216种
    3.所以叫24位真彩色
6.RGBA图像:32位真彩色
    在RGB图像的基础上添加了8位的透明度信息Alpha
    1个像素点则使用4个字节,位图深度8*4=32位
7.256彩色图像
    每个像素使用8位二进制表示,是调色板中的索引值
    所以它需要一个调色板,导致不同的图像对应调色板不同、
    在加载与保存这类图像时,需要将调色板与图像一同保存

###################几种图像形式#############################
图像压缩:
    适当降低图像的质量来减少它占用的空间
    使用不同的压缩算法导致的图像的格式也不同
    1. BMP:占用的空间比较大,不支持文件压缩,不适用网页
    2.jpeg :有损压缩,压缩率高,所占用的空间少。
    适合色彩丰富,细节细腻的大图像
    不适合所含颜色较少的具有大块颜色相近的区域,或者亮度差异明显的简单图片
    且每次编辑都会降低图像的质量,不适合多次编辑的情况
    3.png:是无损压缩,适合于有规律的渐变色彩图像
    4.gif:支持静态格式和动态格式,动态格式就是使用多张图存为一张图,循环显示,
    只支持256色,适用于颜色简单的颜色较少的小图像
    5.tiff格式:定义四种不同的格式:
        5.1二值图像(TIFF-B)
        5.2黑白灰度图像(TIFF-G)
        5.3带调色板的彩色图像(TIFF-P)
        5.4RGB真彩图像(TIFF-R)
    支持rgb,jpeg等多种编码方法
    具有很好的扩展性,是印刷行业最常用的格式
    web不支持tiff格式
色彩模型:
    1.如二值图像,灰度图像,rgb图像,rgba图像
    2.CMYK——印刷四分色:C:cyan青色,M:magenta洋红色,Y:yellow黄色,K:black黑色
    3.YCbCr Y:亮度,Cb:蓝色色度,Cr:红色色度
    4.HSI:   H:色调,S:饱和度,I:亮度
-----------------------图像类型--------------------------------------
1.序列图像
时间上有一定的间隔,内容上相关的一组图像
其中的每幅图像称为帧图像
帧图像之间的时间间隔是固定的
2.深度图像(Depth Map)
是一种三维场景信息表达方式
每个像素的取值代表着这个点与摄像机的距离(相对距离)
采用灰度图表示看,每个像素点一个字节
""")

2. pillow库

from PIL import Image
import tensorflow as tf 
from matplotlib import pyplot as plt 
import numpy as np 
import pandas as pd 
#import cv2 as cv

print("""
matplotlib.image : 仅支持导入PNG格式的图像,且功能有限
PIL (Python Imaging Library)
 功能丰富,简单易用
 仅支持Python2.x版本, 且已经停止更新
Pillow
 在PIL的基础上发展而成
 支持Python 3""")
figure = plt.figure(figsize=(12,12))
plt.subplot(2,3,1)

#函数1.open打开图片,返回值是image对象,
# image对象具有的属性:format图片格式,size图片尺寸,mode色彩模式
img = Image.open("E:/360downloads/1.jpg")
print(img.format)#JPEG
print(img.mode)#RGB
print(img.size)#(300,300)
 #保存图片使用save,名字后缀如果不同,会自己转化
img.save("E:/360downloads/1.png")
#显示图片,必须 先用imshow传入图片对象
# plt.imshow( image 对象 /Numpy 数组 
plt.imshow(img)
#设置不显示坐标轴,不然会绘制图片的size
#plt.axis('off')

#转换图片的色彩模式函数:
#img.convert
"""
1 二值图像
L 灰度图像
P 8位彩色图像
RGB 24位彩色图像
RGBA 32位彩色图像
CMYK CMYK彩色图像
YCbCr YCbCr彩色图像
I 32位整型灰度图像
F 32位浮点灰度图像
"""
# img2 = img.convert('L')
# plt.subplot(2,2,2)
# plt.title(str(img2.mode))
# plt.imshow(img2)

# img3 = img.convert('1')
# plt.subplot(2,2,3)
# plt.title(str(img3.mode))
# plt.imshow(img3)

#----------------颜色通道的分离与合并-----------------------
img_r ,img_g, img_b = img.split()   #三通道分离
img_merge = Image.merge("RGB",[img_r,img_g,img_r])
plt.subplot(2,3,2)
plt.title("R")
plt.imshow(img_r)

plt.subplot(2,3,3)
plt.title("G")
plt.imshow(img_g)

plt.subplot(2,3,4)
plt.title("B")
plt.imshow(img_b)

plt.subplot(2,3,5)
plt.title(str(img_merge.mode))
plt.imshow(img_merge)


#------------------转化为数组-----------------------------------------
img_array = np.array(img)

print(img_array.shape," ",img_array.ndim," ",img_array.size)

print(img_array)

#使用数组分离三通道
i1,i2,i3 = img_array[:,:,0],img_array[:,:,1],img_array[:,:,2]
#对数组取反
array_img = 255-img_array

#二值化
for i in range(300):
    for j in range(300):
        if i1[i,j]>170:
            i1[i,j]=0
        else:
            i1[i,j]=255
plt.subplot(2,3,6)
plt.imshow(i1)
plt.title("threshold")
plt.show()

""" 
对图像的缩放、旋转和镜像
p 缩放图像
图像对象 .resize((width, height))
图像对象 .thumbnail((width, height))
原地操作,返回值是None
PS:
resize()方法不对原图进行修改,
thumbnail()方法是原地操作,直接对image对象本身进行缩放。
 旋转、镜像
图像对象 .transpose( 旋转方式 )
Image.FLIP_LEFT_RIGHT:水平翻转
Image.FLIP_TOP_BOTTOM:上下翻转
Image.ROTATE_90:逆时针旋转90°
Image.ROTATE_180:逆时针旋转180°
Image.ROTATE_270:逆时针旋转270°
Image.TRANSPOSE:将图像进行转置
Image.TRANSVERSE:将图像进行转置,再水平翻转
 裁剪图像: 在图像上指定的位置裁剪出一个矩形区域
返回值:图像对象
"""

演示三通道分离与合并,以及利用数组二值化:
在这里插入图片描述
旋转:

在这里插入图片描述

总结

pillow基本api

  1. 图像操作 方法/函数/属性
    保存图像 图像对象 .save()
    打开图像 Image.open( 路径 )
    显示图像 plt.imshow( image 对象 /Numpy 数组 )
    转换色彩模式 图像对象 .convert( 色彩模式 )
    颜色通道的分离与合并 图像对象 .split()
    Image.merge( 色彩模式, 图像列表 )
    将图像转换为数组 np.array( 图像对象 )
    缩放图像 图像对象 .resize((width, height))
    旋转和镜像 图像对象 .transpose( 旋转方式 )
    裁剪图像 图像对象 .crop((x0 ,y0 ,x1 ,y1 ))
  2. 查看图像属性
    图像对象.format
    图像对象.size
    图像对象.mode
发布了50 篇原创文章 · 获赞 24 · 访问量 2396

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/104440712