首先导入各种相关库
import numpy as np
import cv2
import matplotlib.pyplot as plt
from PIL import Image
读取图像变为矩阵形式
case1:利用opencv
利用cv2.imread进行读取
Img_BGR = cv2.imread('lena512color.tiff')
注意:
- cv2读取的图形颜色格式为BGR,所以需要进行一个调序;
- Img_BGR为矩阵形式
'''利用系统函数'''
Img_RGB = cv2.cvtColor(Img_BGR, cv2.COLOR_BGR2RGB)
'''手动调序'''
#Img_RGB = Img_BGR[:,:,(2,1,0)]
转灰度:
'''调用函数'''
Img_gray = cv2.cvtColor(Img_BGR, cv2.COLOR_BGR2GRAY)
'''利用公式'''
#r,g,b = [Img_RGB[:,:,i] for i in range(3)]
#Img_gray = r*0.299+g*0.587+b*0.114
case2:利用PIL.Image
使用Image.open()打开图像:
Img = Image.open('lena512color.tiff')
注意:这里Img的格式是Image:

可以看到,默认读取的图片格式对应原始图像的格式,这里为RGB,如果你打开一张灰度lena图,对应的就是Mode:L。当然,也可以像opencv那样转换格式,这里用到convert()
Img_GRAY = Img.convert('L')
'''
1 ------------------(1位像素,黑白,每字节一个像素存储)
L ------------------(8位像素,黑白)
P ------------------(8位像素,使用调色板映射到任何其他模式)
RGB------------------(3x8位像素,真彩色)
RGBA------------------(4x8位像素,带透明度掩模的真彩色)
CMYK--------------------(4x8位像素,分色)
YCbCr--------------------(3x8位像素,彩色视频格式)
I-----------------------(32位有符号整数像素)
F------------------------(32位浮点像素)
'''
| mode | 解释 |
| 1 | 1位像素,黑白,每字节一个像素存储 |
| L | 8位像素,黑白 |
| P | 8位像素,使用调色板映射到任何其他模式 |
| RGB | 3x8位像素,真彩色 |
| RGBA | 4x8位像素,带透明度掩模的真彩色 |
| CMYK | 4x8位像素,分色 |
| YCbCr | 3x8位像素,彩色视频格式 |
| I | 32位有符号整数像素 |
| F | 32位浮点像素 |
转换为矩阵只需使用np.array()即可!
显示图像
case1
直接使用Image对应的show()。首先将矩阵形式的图像转化为Image格式,调用show(),就是自定显示对应mode的图像
'''以灰度模式为例'''
Img_GRAY = Image.fromarray(Img,'L')
Img_GRAY.show()
注意:RGB模式可以缺省
case2
使用matplotlib里面的画图工具包
plt.imshow(Img_GRAY, cmap = 'gray')
plt.title('GRAY') #标题
plt.axis('off') #取消坐标轴
plt.show()
注意:
- cmap: 颜色图谱(colormap), 默认绘制为RGB(A)颜色空间,绘制灰度图cmap = 'gray'

- 一般个人仅用其画RGB和灰度图,如YCbCr格式,建议使用case1
保存图像
直接使用save()将Image格式的图像保存即可
Imag_GRAY.save("lena_gray.tiff")
当然,还有更多方法,等待探索,不过以上方案应该已足够应付!
可以参考这一篇,互为补充:
1万+

被折叠的 条评论
为什么被折叠?



