1.3 图片的读取与显示
- 引入OpenCV模块。
- 调用读取和显示图片的API。
- 程序停止(将程序暂停才可以显示出图像,不暂停程序将结束,将闪现出图像而无法观察)。
import cv2
# 功能:读取图片,参数1:图片地址,参数2:0 读取为灰度图 1 读取为彩色图
img = cv2.imread('/2.image_read_show/image1.jpg', 1)
# 功能:显示图片,参数1:窗口名称,参数2:需显示的图片
cv2.imshow('image', img)
# 暂停程序
cv2.waitKey(0)
运行结果:
1.4 图片的写入
图片格式一般分为jpg和png格式,其文件包含文件头和进行压缩编码后的文件数据。
import cv2
img = cv2.imread('/1.4 image_write/image.jpg', 1)
#参数1:写入图片的地址/名称 参数2:写入的数据
cv2.imwrite('/1.4 image_write/image_origin.jpg', img)
jpg是压缩过后的图片文件,img是图像源文件即未压缩的图像数据。通过查看文件大小,可以看出写入生成的图片大小比读取的图片大,因为两种图片的压缩比不同。
1.5 不同图片质量的写入
jpg图片为有损压缩,用图片的质量换取图片的大小;png为无损压缩,图片质量高,图片大小大,支持图片透明。
import cv2
img = cv2.imread('/1.5 image_write_quality/image.jpg', 1)
# 参数1:写入图片的地址/名称 参数2:写入的数据 参数3:图片质量 50%(0-100)
cv2.imwrite('/1.5 image_write_quality/image_test.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 50])
# 参数1:写入图片的地址/名称 参数2:写入的数据 参数3:图片压缩比 0(0-9)
cv2.imwrite('/1.5 image_write_quality/image_test.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 0])
可以观察出,png的图片大小非常大,因为设置了0压缩即不压缩图片;生成的jpg文件比读取的文件小,因为设置图片质量为读取图片质量的50%。
1.6 像素的读取与写入
1.6.1 像素操作基本知识
图片由每个像素组成,我们所见到的420*320的图片,实质上是有420*320个像素组成,每个像素是由RGB三种颜色组成即红绿蓝,每种颜色的颜色深度为8bit,也就是0-255。因此对于不含透明度的图片而言,一个420*320的图片大小为430*320*3*8(bit)=430*320*3*8/8(B)=430*320*3*8/8/1024/1024(M)=0.4M,而对于像png这种带透明度的图像,其每个像素有RGB+alpha组成。
图片都有相应的坐标来确定像素,以图片的右上角为原点,原点向右为x轴,原点向下为y轴,即x表示列,y表示行,因此可以通过xy查找每个像素;对于jpg图片而言,其像素顺序是BGR,不同格式的像素顺序颇为不同。
1.6.2 像素操作代码
import cv2
img = cv2.imread('1.6 image_pixel/image.jpg', 1)
# img[100, 100]是一个元组
# 获取图像坐标为(100,100)的像素值
# jpg像素格式为BGR
(b,g,r) = img[100,100]
print(b, g, r)
# 像素的写入
for i in range(0, 200):
img[i, 100] = (255, 0, 0)
cv2.imshow('image', img)
cv2.waitKey(0)
运行结果: