摘要 OpenCV 图像读取,cv2图像创建,cv2图像复制,cv2图像拼接,np.hstack子图列表,plt子图列表显示,cv2图像色彩模式转换,cv2图像通道拆分,cv2图像加法,cv2图像add和addWeighted,cv2图像不同尺寸重叠,cv2图像图像加logo,掩膜ROI,mask,cv2图像渐变动画,圆形遮罩,cv2图像写字画画,cv2图像处理视频
OpenCV应用领域
1、计算机视觉领域方向
1、人机互动
2、物体识别
3、图像分割
4、人脸识别
5、动作识别
6、运动跟踪
7、机器人
8、运动分析
9、机器视觉
10、结构分析
11、汽车安全驾驶
2、计算机操作底层技术
一 图像基本
1 模块
#--*coding:utf-8*--
import cv2#基本 #opencv 读取的格式是BGR 非rgb
import matplotlib.pyplot as plt #绘图展示
import numpy as np #基本计算
2 读取 创建
2.1 读取(cv2.imread)
图片=cv2.imread("a01.jpg")
灰度图片=cv2.imread("a01.jpg", cv2.IMREAD_GRAYSCALE)
2.2 创建 (np.zeros)
np.zeros() 等方法创建指定大小、类型的图像对象
np.ones_like(img1) * 255 创建和 img 一样大小的 白色图片
白色图片100*300 = np.ones((100, 300), dtype="float")
# 1.14 Numpy 创建图像
# 创建彩色图像(RGB)
# (1) 通过宽度高度值创建多维数组
width, height, channels = 400, 300, 3 # 行/高度, 列/宽度, 通道数
imgEmpty = np.empty((400, 300, 3 ), np.uint8) # 创建空白数组
imgBlack = np.zeros((width, height, channels), np.uint8) # 创建黑色图像 RGB=0
imgWhite = np.ones((width, height, channels), np.uint8) * 255 # 创建白色图像 RGB=255
# (2) 创建相同形状的多维数组
img1 = cv2.imread("../images/imgLena.tif", flags=1) # flags=1 读取彩色图像(BGR)
imgBlackLike = np.zeros_like(img1) # 创建与 img1 相同形状的黑色图像
imgWhiteLike = np.ones_like(img1) * 255 # 创建与 img1 相同形状的白色图像
# (3) 创建彩色随机图像 RGB=random
import os
randomByteArray = bytearray(os.urandom(width * height * channels))
flatNumpyArray = np.array(randomByteArray)
imgRGBRand = flatNumpyArray.reshape(width, height, channels)
# (4) 创建灰度图像
imgGrayWhite = np.ones((width, height), np.uint8) * 255 # 创建白色图像 Gray=255
imgGrayBlack = np.zeros((width, height), np.uint8) # 创建黑色图像 Gray=0
imgGrayEye = np.eye(width) # 创建对角线元素为1 的单位矩阵
randomByteArray = bytearray(os.urandom(width * height))
flatNumpyArray = np.array(randomByteArray)
imgGrayRand = flatNumpyArray.reshape(width, height) # 创建灰度随机图像 Gray=random
————————————————
版权声明:本文为CSDN博主「Python小白进阶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youcans/article/details/121174586
3 复制 拼接
3.1复制(np.copy)
图片2=图片.copy()
3.2 拼接
retval = numpy.hstack((img1, img2, …)) # 水平拼接 高度(行)相同
retval = numpy.vstack((img1, img2, …)) # 垂直拼接 宽度(列)相同
- 综合使用 np.hstack() 和 np.vstack() 函数,可以实现图像的矩阵拼接
4 关闭 保存
cv2.destroyAllWindows()
cv2.imwrite(“z图像保存.jpg”,img1)
5 显示
5.1 图片数据
print(“图片”,图片)
print(“图片”,图片[5,:,0]) #只显示 5行
5.2 图片信息 (宽\高和通道)
print(图片.shape,图片.size)
5.4 图片显示 /视频
-
cv2.imshow("",图片)
-
cv2.imshow(“影片”,cv2.cvtColor(cv2.read(影片)[1]))
打开,帧=影片.read() cv2.imshow("影片",帧)
6 停止
6.4 停止图片
-cv2.waitKey(100)
6.5 停止 视频
- cv2.waitKey(25)&0xFF==27: # 键盘ESC(27)退出, 否则等待25毫秒
7 列表
7.1 np.hstack
展示=np.hstack((图片,图片2)) # 同尺寸
cv2.imshow(“zhanshi”,展示))
cv2.waitKey(0)
7.2 plt
# 边界填充
#--*coding:utf-8*--
import cv2
import numpy as np
图片=cv2.imread("a01.jpg")
复制边缘=cv2.copyMakeBorder(图片,100,100,200,200,cv2.BORDER_REPLICATE)
# 可以先规定 上下左右
top,bottom,left,right=(100,100,200,200)
反射边缘=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_REFLECT)
反射边缘_101=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_REFLECT_101)
常量边缘=cv2.copyMakeBorder(图片,top,bottom,left,right,cv2.BORDER_CONSTANT,value=0)# 黑色 0
- b调整 颜色 顺序 bgr → rgb
# 另一种显示方式 列表显示
import matplotlib.pyplot as plt
### 调整 颜色 顺序 bgr → rgb
def bgr2rgb(cv2_img):
# 灰度图直接返回
if len(cv2_img.shape)==2:return cv2_img
# 三通道图
elif len(cv2_img.shape)==3 and cv2_img.shape[2]==3:
b,g,r,=cv2.split(cv2_img)
return cv2.merge((r,g,b))
# 三通道+明度
elif len(cv2_img.shape)==3 and cv2_img.shape[2]==4:
b,g,r,a=cv2.split(cv2_img)
return cv2.merge((r,g,b,a))
# 不明格式
else:return cv2_img
# 列表显示
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示汉字
plt.subplots(constrained_layout=True) # 子图自适应行距 constrained 受约束的
plt.subplot(321),plt.imshow(bgr2rgb(图片),"gray"),plt.title("原图")
plt.subplot(323),plt.imshow(bgr2rgb(复制边缘),"gray"),plt.title("复制边缘")
plt.subplot(324),plt.imshow(bgr2rgb(反射边缘),"gray"),plt.title("反射边缘")
plt.subplot(325),plt.imshow(bgr2rgb(反射边缘_101),"gray"),plt.title("反射边缘_101")
plt.subplot(326),plt.imshow(bgr2rgb(常量边缘),"gray"),plt.title("常量边缘")
plt.show()
7.3 plt 列表骚操作
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示汉字
plt.subplots(constrained_layout=True) # 子图自适应行距 constrained 受约束的
# 总3行, 本行3列 第二列
plt.subplot(332),plt.imshow(bgr2rgb(融合相加)),plt.title("融合相加")
# 总三行 本行2列 , 感觉应该是 4 5 但不行 只能 3 4
plt.subplot(323),plt.imshow(bgr2rgb(融合二值化_ROI)),plt.title("融合二值化_ROI")
plt.subplot(324),plt.imshow(bgr2rgb(融合二值化_反_原logo)),plt.title("融合二值化_反_原logo")
# 总 三行 本行4列 3*4 12 所以从 9-12,之所以用,隔开 是因为 10 11 12 两位数
plt.subplot(3,4,9),plt.imshow(bgr2rgb(ROI)),plt.title("ROI")
plt.subplot(3,4,10),plt.imshow(bgr2rgb(二值化_logo_mask),"gray"),plt.title("二值化")
plt.subplot(3,4,11),plt.imshow(bgr2rgb(logo_img)),plt.title("log原图")
plt.subplot(3,4,12),plt.imshow(bgr2rgb(二值化_logo_mask_反),"gray"),plt.title("二值化-反"