目录
1. 读取显示图像
(1)读取图像
cv2.imread() 函数
image.open() 函数
(2)显示图像
cv2.imshow()函数
img.show()函数
2. 读取修改像素
(1)读取像素
print(img.shape)函数
print(img.size)函数
print(img)函数
使用 numpy 库
像素值不同的原因
(2)修改像素
3. 保存图像
(1)使用 PIL 库
(2)使用 OpenCV 库
4. 获取图像属性
总结
读取显示这部分在前面已经记录过了,在这里我们简单过一下: Python 计算机视觉(二) —— OpenCV 基础
import cv2
img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg')
注意路径中不能包含有中文以及一些莫名其妙的空格哦 ,不然会报错
imread() 函数不仅仅只有一个图像路径的参数 ,路径后面还有一个 flag 参数可以决定读入的图像的颜色类型
至于该参数可选取的值以及意义如下:
IMREAD_ANYCOLOR = 4 #读取彩色图像
IMREAD_ANYDEPTH = 2 #读取灰度图像
IMREAD_COLOR = 1 #读取彩色图像
IMREAD_GRAYSCALE = 0 #读取灰度图像IMREAD_IGNORE_ORIENTATION = 128
IMREAD_LOAD_GDAL = 8
IMREAD_REDUCED_COLOR_2 = 17
IMREAD_REDUCED_COLOR_4 = 33
IMREAD_REDUCED_COLOR_8 = 65IMREAD_REDUCED_GRAYSCALE_2 = 16
IMREAD_REDUCED_GRAYSCALE_4 = 32
IMREAD_REDUCED_GRAYSCALE_8 = 64IMREAD_UNCHANGED = -1
至于其他的一些参数的意义可以自己去尝试得到输出进行观察
使用该方法读取到的是图片本身
from PIL import Image
安装 PIL 库时可能会报错,试着安装 Pillow-PIL
from PIL import Image
img2 = Image.open('E:\Python\StudyOfOpencv\qilin2.jpeg')
使用 imread 函数读取图像,显示图像使用 cv2.imshow() 函数,但需要创建显示窗口,在窗口中显示图像,这些我也在前面的那篇文章中提到过
import cv2
img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg') #读取图像
cv2.namedWindow("Qilin")
cv2.imshow("Qilin", img1) #显示图像
cv2.waitKey(delay = 0)
得到图像显示:
使用的是 Image.open() 函数读取图像,则需要用该函数显示图像,不需要创建窗口
img.show() 中的 img 是图像名称,需要进行修改
from PIL import Image
img2 = Image.open('E:\Python\StudyOfOpencv\qilin2.jpeg') #读取图像
img2.show() #显示图像
使用该函数打开图像可能会报错,提示没有对应软件打开文件
解决方法:打开设置-->应用 --> 默认程序 --> 选择报错的文件后缀为其添加默认的应用软件
得到图像显示:
在此处是用图像软件打开的,原因就是上面提到的需要为该文件添加默认打开软件
使用 cv2.imread() 函数读取图像后,为显示图像的类型以及分辨率可以使用该函数
print(img1.shape)
得到输出:(506, 564, 3)
说明该图像是 564*506 的三通道 图像,至于分辨率为什么反过来后面再说
使用 Image.open() 得到图像后使用该函数输出图像的大小,即分辨率
print(img2.size)
得到输出:(564, 506)
可以看出刚好和前面的是反过来的
使用 cv2.imread() 函数得到的图像要用该函数输出像素值:
print(img1)
[[[254 251 253]
[254 251 253]
[254 251 253]
...
[245 236 227]
[245 236 227]
[245 236 227]][[254 251 253]
[254 251 253]
[254 251 253]
...
[245 236 227]
[245 236 227]
[245 236 227]][[254 251 253]
[254 251 253]
[254 251 253]
...
[245 235 228]
[245 235 228]
[245 235 228]]...
[[ 45 62 71]
[ 44 62 69]
[ 44 61 70]
...
[ 32 46 42]
[ 32 46 42]
[ 32 46 42]][[ 41 57 64]
[ 41 57 63]
[ 41 57 64]
...
[ 27 41 37]
[ 32 46 42]
[ 31 45 41]][[ 43 57 63]
[ 43 57 63]
[ 43 57 63]
...
[ 27 41 37]
[ 32 46 42]
[ 31 45 41]]]
前面提到过,使用 Image.open() 函数得到的图象是原始的图像,所以需要将它转化为数组形式再进行输出得到相应的像素点值
from PIL import Image
import numpy as np
img2 = Image.open('E:\Python\StudyOfOpencv\qilin1.jpeg')
image = np.asarray(img2)
print(image)
[[[253 251 254]
[253 251 254]
[253 251 254]
...
[227 236 245]
[227 236 245]
[227 236 245]][[253 251 254]
[253 251 254]
[253 251 254]
...
[227 236 245]
[227 236 245]
[227 236 245]][[253 251 254]
[253 251 254]
[253 251 254]
...
[228 235 245]
[228 235 245]
[228 235 245]]...
[[ 71 62 45]
[ 69 62 44]
[ 70 61 44]
...
[ 42 46 32]
[ 42 46 32]
[ 42 46 32]][[ 64 57 41]
[ 63 57 41]
[ 64 57 41]
...
[ 37 41 27]
[ 42 46 32]
[ 41 45 31]][[ 63 57 43]
[ 63 57 43]
[ 63 57 43]
...
[ 37 41 27]
[ 42 46 32]
[ 41 45 31]]]
通过两种不同的函数得到的图像读取的像素刚好是反过来的这是因为:cv2.imread() 读取的是 BGR 格式,而 Image.open() 读取的是 RGB 格式,所以它们两者的 Red&Blue 通道刚好反过来了
而且使用 cv2.imread() 函数得到的图像本来就是经过采样的,所以可以直接打印分辨率,然而 image.open() 函数得到的图像则是原本的图像,所以需要将其转化为数组形式才能打印分辨率
要将图像修改为灰度图,那么在 OpenCv 库中使用 cvtColor() 函数就可以实现,这在上一篇文章中提到过
但如果是使用 Image.open() 库得到的图像,则需要对每一个像素点的像素值进行调整
img2 = Image.open('E:\Python\StudyOfOpencv\qilin1.jpeg')
pix = img2.load() #导入像素
width = img2.size[0] #获取宽度
height = img2.size[1] #获取长度
temp = 1
for x in range(width): #遍历宽度
temp += 1
for y in range(height): #遍历长度
if temp % 2 == 0: #每隔一个像素点转化为一个白点
img2.putpixel((x, y), (255, 255, 255))
img2.show()
得到图像如上
对于上面的得到的图像使用 img2.save() 函数就可以进行保存:
img2.save('E:\Python\StudyOfOpencv\qilin1_1.jpeg')
首先我们将图像转化为灰度图像:
img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg')
cv2.namedWindow("Qilin")
img_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #对图像进行灰度处理
cv2.imshow("Qilin", img_gray)
得到的灰度图像如下:
cv2.imwrite('E:\Python\StudyOfOpencv\qilinone.jpeg', img_gray)
如果报错了检查一下是否在保存路径中忘了添加图像后缀
使用 cv2.imread() 函数读取图像后,为显示图像的类型以及分辨率可以使用 print(img.shape), 前面提到过,这里就不赘述了
也提到过 print(img.size) 当然这适用于使用 Image.open() 得到的图像
这篇文章主要承接了上一篇文章 —— OpenCV 基础,记录了其他的几种显示图像,保存图像、观察图像特性的方法,主要也是为后面的学习打下基础