pip3 install opencv-python
OpenCV能够对图像更进一步处理,例如合并图片、添加水印等 , 安装好opencv后导包cv2 .
import cv2
# 参1图片 , 参2读取方式,如果换成cv2.IMREAD_GRAYSCALE,是以灰色模式读取
img = cv2.imread('image.jpeg', cv2.IMREAD_COLOR)
print(img) # 矩阵 线性代数
利用 imread函数读取图片
参1 : 图片
参2 : 读取方式 :
读取到的是一个矩阵 , 线性代数
import cv2
img = cv2.imread('image.jpeg', cv2.IMREAD_COLOR)
#显示图片参1是窗口名字 参2是图片 的数据
cv2.imshow('窗口A', img)
# 等待按下键盘 传入0代表一直等待 直到有按下 传入>0的数 就等待对应的毫秒数
# 返回按键的ascii码
key = cv2.waitKey(0)
利用imshow函数,把第一部读到的数据读出来
参数1 : 是自定义窗口名
参数2 : 图像数据
(我们可以创建任意多个窗口,但窗口名称需要保证不同)
直接调用imshow是使用默认的窗口格式,可以先创建一个可以缩放的窗口,再用imshow显示在新窗口上
# 创建 一个可以拖拽缩放的创建
cv2.namedWindow('erha',cv2.WINDOW_NORMAL)
cv2.waitKey是一个键盘绑定函数,它的参数是以毫秒为单位。该函数等待在指定毫秒内任何的键盘事件(比如按下键盘中任意一个键)。如果在那个时间段内按下键盘中任何键,程序将继续。如果参数设置为了0,它将无限期地等待键击.
# 保存的文件名字,要保存的图像目表
cv2.imwrite('newimage', img)
利用imwrite函数,保存图片
参1 : 是一个新的文件名
参2 : 是要保存的图像的矩形信息
1 给图片添加添加白线
import cv2
# 读取这个图片的矩阵
img = cv2.imread('img1.jpg', cv2.IMREAD_UNCHANGED)
# 2. 循环的方式修改某个位置的BGR
for i in range(500):
img[i, i] = [255, 255, 255]
# 用矩阵写一个图片(参1图片名,参2矩阵)
cv2.imwrite("newimg.jpg", img)
key = cv2.waitKey(0)
print(key)
# 销毁窗口
cv2.destroyAllWindows()
把修改后的图片包存起来了, 并没有显示在窗口上
2 给图片一个部分贴到另一个图片上
import os
import cv2
# 读取这个图片的矩阵信息
img1 = cv2.imread('img1.jpg', cv2.IMREAD_UNCHANGED)
# 读取这个图片的矩阵
img2 = cv2.imread('img2.jpg', cv2.IMREAD_UNCHANGED)
# x,y 范围不是点
img1[100:250, 100:250] = img2[200:350, 200:350]
# 显示hehe这个窗口,内容是img1
cv2.imshow('hehe', img1)
key = cv2.waitKey(0)
print(key)
# 销毁窗口
cv2.destroyAllWindows()
把图片1的一部分 , 显示在图片2上 .
图像的属性都包括
行数
列数
通道数channels
图像数据类型
像素数 …等等…
1 . img.shape
图像的形状可以由img.shape 来得到,它会返回以元组为形式的的行数,列数和通道数(如果图像是彩色的):
一幅完整的图像,是由红色绿色蓝色三个通道组成的。他们共同作用产生了完整的图像,
注意:
读取彩色图的通道数是3
如果图像是灰度的,返回的元组就只会包含行数和列数,没有通道数灰度图没有通道数,所以
用shape 来检测加载的图像是灰度图像还是彩色图像是一种很实用的方法
2 . img.size
像素的总数(行数x列数x通道数)可以用img.size来得到:
3 . img.dtype
图像的数据类型可以通过img.dtype来获得:
img.dtype 在debug 过程中是非常重要的,因为OpenCV-Python 代码中的大量错误都是由无效的数据类型引起的。
uint8 是值 无符号的8位整数 图片rgb每一种颜色的取值是0-255,最多8位