摘要 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("二值化-反")
plt.show()
8 色彩转换
8.1 色彩转换
img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB
8.2 通道分合
# 拆
b,g,r=cv2.split(图片)
# 合
图片通道合成rgb=cv2.merge(r,g,b)
8.3 R通道
img[:,:,0]=0
img[:,:,1]=0
cv2.imshow(“红色”,img)
cv2.waitKey(100)
8.4 B通道
img2=cv2.imread(“a01.jpg”)
img2[:,:,1]=0
img2[:,:,2]=0
cv2.imshow(“B”,img2)
9 大小
print(img1.size,img1.dtype)
9.1 缩放
图片2=cv2.resize(图片,(500,50))
图片3=cv2.resize(图片,(0,0),fx=倍数,fy=倍数)
图片3=cv2.resize(图片,(int(图片.shape[0]*0.5),int(图片.shape[1]*0.5))) # 好像必须是整数
9.2 截取 ROI
根据对图像的x轴和y轴 坐标设定
截图=img1[:d,:800] #上边界 到 下500, 右边界 到800
截图=img[上:下,左:右] # img[:,:] 冒号两边空时,为到边界
9.3 边界填充
# 边界填充
#--*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
# 另一种显示方式 列表显示
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()
10 翻转 Flip
使用函数cv2.flip(img,flipcode)翻转图像,flipcode控制翻转效果。
flipcode = 0:沿x轴翻转
flipcode > 0:沿y轴翻转
flipcode < 0:x,y轴同时翻转
翻转的图片= cv2.flip(原始图片,1)
11 旋转
11.1 圆心为中心
- 由函数 cv2.warpAffine 可以实现任意角度和任意中心的旋转效果。
- 以图像中心作为旋转中心时,可以用 img.shape 获得图像的宽度和高度值,除以 2 就是图像中心点坐标。
- 旋转角度为 90,180,270 度时,可以用 cv2.rotate(src, rotateCode) 函数实现,该方法实际上是通过矩阵转置实现的,因此速度很快。
# 1.35 图像旋转 (以原点 (0,0) 为中心旋转)
img = cv2.imread("../images/imgLena.tif") # 读取彩色图像(BGR)
rows, cols, ch = img.shape
theta = np.pi / 8.0 # 顺时针旋转角度
cosTheta = np.cos(theta)
sinTheta = np.sin(theta)
MAT = np.float32([[cosTheta, -sinTheta, 0], [sinTheta, cosTheta, 0]]) # 构造旋转变换矩阵
# dst = cv2.warpAffine(img, MAT, (cols, rows)) # 默认为黑色填充
dst = cv2.warpAffine(img, MAT, (cols, rows), borderValue=(255,255,255)) # 设置白色填充
plt.figure(figsize=(9,6))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title("Origin")
plt.subplot(122), plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)), plt.title("Rotation")
plt.show()
————————————————
版权声明:本文为CSDN博主「Python小白进阶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youcans/article/details/121314279
11.2 任意点为中心
cv2.getRotationMatrix2D(center, angle, scale) → M
参数说明:
center:旋转中心坐标,二元元组 (x0, y0)
angle:旋转角度,单位为角度,逆时针为正数,顺时针为负数
scale: 缩放因子
返回值:M, 旋转变换矩阵,2行3列
# 1.36 图像旋转 (以任意点 (x0,y0) 为中心旋转)
img = cv2.imread("../images/imgGaia.tif") # 读取彩色图像(BGR)
height, width = img.shape[:2] # 图片的高度和宽度
theta1, theta2 = 30, 45 # 顺时针旋转角度,单位为角度
x0, y0 = width//2, height//2 # 以图像中心作为旋转中心
MAR1 = cv2.getRotationMatrix2D((x0,y0), theta1, 1.0)
MAR2 = cv2.getRotationMatrix2D((x0,y0), theta2, 1.0)
imgR1 = cv2.warpAffine(img, MAR1, (width, height)) # 旋转变换,默认为黑色填充
imgR2 = cv2.warpAffine(img, MAR2, (width, height), borderValue=(255,255,255)) # 设置白色填充
plt.figure(figsize=(10,6))
plt.subplot(131), plt.axis('off'), plt.title(r"$Origin$")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.subplot(132), plt.axis('off'), plt.title(r"$Rotation {}^o$".format(theta1))
plt.imshow(cv2.cvtColor(imgR1, cv2.COLOR_BGR2RGB))
plt.subplot(133), plt.axis('off'), plt.title(r"$Rotation {}^o$".format(theta2))
plt.imshow(cv2.cvtColor(imgR2, cv2.COLOR_BGR2RGB))
plt.show()
————————————————
版权声明:本文为CSDN博主「Python小白进阶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youcans/article/details/121314339
12 扭曲
由函数 cv2.warpAffine 可以计算变换后的扭变图像。
# 1.41 图像的错切
img = cv2.imread("../images/imgB2.jpg") # 读取彩色图像(BGR)
height, width = img.shape[:2] # 图片的高度和宽度
MAS = np.float32([[1, 0.2, 0], [0, 1, 0]]) # 构造错切变换矩阵
imgShear = cv2.warpAffine(img, MAS, (width, height))
plt.figure(figsize=(9,6))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title("imgOrigin")
plt.subplot(122), plt.imshow(cv2.cvtColor(imgShear, cv2.COLOR_BGR2RGB)), plt.title("imgShear")
plt.show()
13 加法
13.1 像素的编辑
像素的编辑
- 读取
img[100,100] ,[155 118 2] =>读取点[100,100]坐标值的bgr
img[100,100,0] # 155 => 点[100,100]的第0通道(b通道)的值 155 - 修改
img[100,100] = [255,255,255] => 直接修改这个点的 bgr
img.itemset((100,100,0),100) =>用itenset 修改 0通道的值为100
直接读取的时候 用中括号, item时 用小括号
# coding:utf8
import numpy as np
import cv2
img = cv2.imread("Tim Walker (131).jpg")
#获取像素值
px = img[100,100] # [155 118 2] :[100,100]坐标值的bgr
blue = img[100,100,0] # 155 :[100,100]这个点的0通道,b通道的值 155
print(px, blue) #[155 118 2] 155
#修改像素值
img[100,100] = [255,255,255]
print(img[100,100]) #[255 255 255]
#使用item修改
print("[10,10]",img[10,10]) # [175 144 15]: 坐标[10,10]像素点的bgr
print(img.item(10,10,2)) # 15:[10,10],这个点的2通道,r通道值是15
img.itemset((100,100,0),100) # 修改 [10,10] 这个点的r通道值,为100
print(img.item(100,100,0)) #100
print(img[100,100]) #[100 255 255]
13.2 同尺寸 add addWeighted
-图片的大小和类型(通道数)必须相同
猫图 = cv2.imread('cat.jpg')
狗图 = cv2.imread('dog.jpg')
直接相加 = 狗图 + 猫图
加标量 = 猫图 + 30
add相加 = cv2.add(狗图, 猫图)
权重混合相加 = cv2.addWeighted(狗图, 0.7, 猫图, 0.3, 0) # 0.7为权重, 0为gama值
代码奉上
# --*coding:utf-8*--
import cv2 # 读取的格式 是BGR
import matplotlib.pyplot as plt # 列表展示 rgb
import numpy as np
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示汉字
猫图 = cv2.imread('cat.jpg')
狗图 = cv2.imread('dog.jpg')
直接相加 = 狗图 + 猫图
加标量 = 猫图 + 30
add相加 = cv2.add(狗图, 猫图)
权重混合相加 = cv2.addWeighted(狗图, 0.7, 猫图, 0.3, 0) # 0.7为权重, 0为gama值
def bgr2rgb(cv2_img) :
# 灰度图片直接返回
if len(cv2_img.shape) == 2 :
return cv2_img
# 3通道的BGR图片
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))
# 4通道的BGR图片
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.subplots(constrained_layout=True) # 子图自适应行距
plt.subplot(321), plt.imshow(bgr2rgb(猫图)), plt.title("猫图")
plt.subplot(322), plt.imshow(bgr2rgb(狗图)), plt.title("猫图")
plt.subplot(323), plt.imshow(bgr2rgb(加标量)), plt.title("加标量+10")
plt.subplot(324), plt.imshow(bgr2rgb(直接相加)), plt.title("直接相加")
plt.subplot(325), plt.imshow(bgr2rgb(add相加)), plt.title("add相加,")
plt.subplot(326), plt.imshow(bgr2rgb(权重混合相加)), plt.title("权重混合相加")
plt.show()
- 扩展阅读 13.2 常量(常数)和标量
- 注意 cv2.add() 对图像与标量相加时,“常数” 与 “标量” 的区别:
- 将图像与一个常数 value 相加,只是将 B 通道即蓝色分量与常数相加,而 G、R 通道的数值不变,因此图像发蓝。
- 将图像与一个标量 scalar 相加,“标量” 是指一个 1x3 的 numpy 数组,此时 B/G/R 通道分别与数组中对应的常数相加,因此图像发白。
- 标量 numpy 数组的形式为:np.array([[c1, c2, c3]]),常数 c1,c2,c3 可以相同或不同。
————————————————
版权声明:本文为CSDN博主「Python小白进阶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/youcans/article/details/121191469
# 1.23 图像的加法 (与标量相加)
img1 = cv2.imread("../images/imgB1.jpg") # 读取彩色图像(BGR)
img2 = cv2.imread("../images/imgB3.jpg") # 读取彩色图像(BGR)
Value = 100 # 常数
# Scalar = np.array([[50., 100., 150.]]) # 标量
Scalar = np.ones((1, 3), dtype="float") * Value # 标量
imgAddV = cv2.add(img1, Value) # OpenCV 加法: 图像 + 常数
imgAddS = cv2.add(img1, Scalar) # OpenCV 加法: 图像 + 标量
13.3 不同尺寸
13.4 重叠加法
目标图[:行_logo,:列_logo]=logo[:,:]
#--*coding:utf-8*--
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 1,读入图片
logo=cv2.imread("logo.jpg",cv2.IMREAD_COLOR)
目标图=cv2.imread("jindi.jpg",cv2.IMREAD_COLOR)
行_logo,列_logo,通道=logo.shape
目标图[:行_logo,:列_logo]=logo[:,:]
cv2.imshow("1",目标图)
cv2.waitKey()
13.5 掩膜加法 ROI mask
13.6 加logo
- cv2.add(img,mask) 对被掩模图像遮蔽的黑色区域不进行处理,保持黑色。
- 掩膜 遮蔽区域为黑色,非遮蔽区域为透明,开窗区域
- 掩膜 与 原图 尺寸必须相同
详见 本人 另一篇 文字 cv2 给图像加logo ,plt子图列表
# coding:utf8
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 图像处理,将logo图标叠加到一张图片的右上角,要求有颜色的区域为不透明
# 1,对logo进行缩放,按照20%进行
logo_img = cv2.imread("logo.png", cv2.IMREAD_COLOR)
logo_img = cv2.resize(logo_img, (0, 0), fx=0.2, fy=0.2, interpolation=cv2.INTER_NEAREST) # inter..这个是为了对齐
# 2,对logo做清洗,白色区域是255,其他区域置为黑色0
logo_gray = cv2.cvtColor(logo_img, cv2.COLOR_BGR2GRAY) # 变成灰度图
阈值, 二值化_logo_mask = cv2.threshold(logo_gray, 200, 255, cv2.THRESH_BINARY) # 二值化函数,大于200的当255,非黑即白
二值化_logo_mask_反 = cv2.bitwise_not(二值化_logo_mask)
# 3,提取目标图片的ROI
目标图 = cv2.imread("wolf.jpg", cv2.IMREAD_COLOR)
行_logo, 列_logo, 通道 = logo_img.shape
行_目标图, 列_目标图, 通道2 = 目标图.shape
ROI=目标图[:行_logo,列_目标图-列_logo:]
# 4,ROI和LOGO图像融合
融合二值化_ROI=cv2.bitwise_and(ROI,ROI,mask=二值化_logo_mask)
融合二值化_反_原logo=cv2.bitwise_and(logo_img,logo_img,mask=二值化_logo_mask_反)
融合相加=cv2.add(融合二值化_反_原logo,融合二值化_ROI)
# 5, ROI 贴回目标图
目标图[:行_logo,列_目标图-列_logo:]=融合相加[:,:]
cv2.imwrite("wolf++.jpg",目标图)
cv2.imshow("++", 目标图)
cv2.waitKey(100)
"""展示 勿删 plt"""
# cv2与matplotlib的图像转换,cv2是bgr格式,matplotlib是rgb格式
def bgr2rgb(cv2_img) :
# 灰度图片直接返回
if len(cv2_img.shape) == 2 :
return cv2_img
# 3通道的BGR图片
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))
# 4通道的BGR图片
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(441),plt.imshow(bgr2rgb(logo_img)),plt.title("log原图")
plt.subplot(442),plt.imshow(bgr2rgb(目标图)),plt.title("目标图")
plt.subplot(443),plt.imshow(bgr2rgb(ROI)),plt.title("ROI")
plt.subplot(445),plt.imshow(bgr2rgb(logo_gray),'gray'),plt.title("灰度图")
plt.subplot(446),plt.imshow(bgr2rgb(二值化_logo_mask),"gray"),plt.title("二值化")
plt.subplot(447),plt.imshow(bgr2rgb(二值化_logo_mask_反),"gray"),plt.title("二值化-反")
plt.subplot(449),plt.imshow(bgr2rgb(融合二值化_ROI)),plt.title("融合二值化_ROI")
plt.subplot(4,4,10),plt.imshow(bgr2rgb(融合二值化_反_原logo)),plt.title("融合二值化_反_原logo")
plt.subplot(4,4,11),plt.imshow(bgr2rgb(融合相加)),plt.title("融合相加")
plt.show()
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("二值化-反")
plt.show(
13.7 渐变动画 addWeighted
cv2.addWeighted(img1,权重, img2, (1 - 权重), gamma)
注意事项:
- 图片的大小和类型(通道数)必须相同。
- 权重和gamma 可调,可推荐取, gamma=0
- gamma: 灰度系数,图像校正的偏移量,用于调节亮度
#--*coding:utf-8*--
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 1,读入图片
猫图=cv2.imread("cat.jpg",cv2.IMREAD_COLOR)
狗图=cv2.imread("dog.jpg",cv2.IMREAD_COLOR)
渐变范围=np.arange(0.0, 1.0, 0.05) #开始 结束 步长
for 权重 in 渐变范围:
渐变=cv2.addWeighted(猫图,权重,狗图,1-权重,0)
cv2.imshow("1",渐变)
cv2.waitKey(100)
13.8 圆形遮罩
掩膜 头像,图标之类 常用
cv2.circle(图片, 圆心坐标, 半径, color, 粗细)
# coding:utf8
import numpy as np
import cv2
from matplotlib import pyplot as plt
"""
[思路]:1,用mask 扣一个圆形mask 2, 融合
"""
# 读入
照片 = cv2.imread("duzong.jpg")
# 把3值照片,做成2值容器,并在容器上 画 mask 掩膜
二值容器 = np.zeros(照片.shape[:2], np.uint8) # [:2]二值相对于 ,必须指定 np.uint8,否则会报错
容器=二值容器.copy()
mask = cv2.circle(容器, (250,230), 150, 255,-1)# 二值掩膜 ## 参数 坐标,半径,颜色,粗细,-1实心
# 掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除
# 建白色蒙版
蒙版 = np.ones_like(照片) * 255
照片_mask = cv2.bitwise_and(照片, 照片, mask=mask)
蒙版_mask = cv2.bitwise_and(蒙版,蒙版 , mask=~mask) # 这个 =~ 应该就是 反mask吧
融合 = cv2.add(照片_mask, 蒙版_mask)
- 显示
plt.rcParams["font.sans-serif"] = ["SimHei"] # 显示汉字
plt.subplots(constrained_layout=True) # 子图自适应行距 constrained 受约束的
# 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.subplot(331),plt.imshow(bgr2rgb(照片)),plt.title("原图")
plt.subplot(332),plt.imshow(bgr2rgb(二值容器)),plt.title("二值容器")
plt.subplot(333),plt.imshow(bgr2rgb(mask)),plt.title("mask")
plt.subplot(3,4,9),plt.imshow(bgr2rgb(蒙版)),plt.title("蒙版")
plt.subplot(3,4,10),plt.imshow(bgr2rgb(照片_mask)),plt.title("照片_mask")
plt.subplot(3,4,11),plt.imshow(bgr2rgb(蒙版_mask)),plt.title("蒙版_mask")
plt.subplot(3,4,12),plt.imshow(bgr2rgb(融合)),plt.title("融合")
plt.show()
plt.subplot(432),plt.imshow(bgr2rgb(融合)),plt.title("融合")
plt.subplot(423),plt.imshow(bgr2rgb(照片_mask)),plt.title("照片_mask")
plt.subplot(424),plt.imshow(bgr2rgb(蒙版_mask)),plt.title("蒙版_mask")
plt.subplot(425),plt.imshow(bgr2rgb(mask)),plt.title("mask mask")
plt.subplot(426),plt.imshow(bgr2rgb(mask)),plt.title("mask mask")
#
plt.subplot(4,4,13),plt.imshow(bgr2rgb(照片)),plt.title("照片")
plt.subplot(4,4,14),plt.imshow(bgr2rgb(照片)),plt.title("照片")
plt.subplot(4,4,15),plt.imshow(bgr2rgb(蒙版)),plt.title("蒙版")
plt.subplot(4,4,16),plt.imshow(bgr2rgb(蒙版)),plt.title("蒙版")
plt.show()
11 画画
# 写字画画
#--*coding:utf-8*--
import cv2
import numpy as np
# 创建一个数组, 画布
画布=np.ones((600,400,3),dtype="uint8")*88 # 填充灰色
# 线 型 面
# 线=cv2.line(画布,(0,0),(10,10),390,390,10)
线=cv2.line(画布,(0,0),(390,390),(125,20,0),5)
矩形=cv2.rectangle(画布,(100,300),(300,500),(0,125,20),5)
矩形_实心=cv2.rectangle(画布,(200,420),(250,320),(255,125,20),-1)
圆形=cv2.circle(画布,(200,200),150,(20,20,200),6)
椭圆形=cv2.ellipse(画布,(200,200),(50,20),20,10,300,(20,20,200),-1)
# 20,20,200 分别表示 x y轴 倾斜度数, 200表示扇形度数
12 写字
12.1英文
引入字体# 图片对象,要写的内容,左边距,字的底部到画布上端的距离,字体,大小,颜色,粗细
英文文字=cv2.putText(画布,“English”,(30,550),cv2.FONT_HERSHEY_DUPLEX,5,(125,0,200),5)
cv2.imwrite(“z600.jpg”,画布)
由于 cv2 不支持中文, 遇到中文的时候还是要用 PIL的, 两种方案的打开方式和 展现方式都不一样的
12.2 PIL 中文字体 中文字体
from PIL import Image,ImageDraw,ImageFont
画布2=Image.open("z600.jpg")
画笔=ImageDraw.Draw(画布2)
字体=ImageFont.truetype("C:\WINDOWS\FONTS\STHUPO.TTF",44)
# 内容
画笔.text((30,10),"中文字体",fill="red",font=字体)
#显示 中文
画布2.show()
# 显示 英文 cv2
cv2.imshow("English",画布)
cv2.waitKey(0)
二 视频
思路
VideoCapture读入影片 → ISOpend 判断是否能打开,并未下一步循环 准备 “打开”
显示 每一帧, weitKey 25毫秒, 或者ESC退出
和图片区别
打开 图片=vc2.imread("图片.jpg")
影片=VC2.cvtColor(影片.read()[1])
# --*coding:utf-8*--
import cv2 # 基本 #opencv 读取的格式是BGR 非rgb
import numpy as np # 基本计算
# 读入数据
影片 = cv2.VideoCapture("v02 卡点.mp4")
# 图片读取
cv2.imread("图片名称.jpg")
# cv2.imshow("ship",影片) #不能直接读视频
# 要先拆开,在合成
## 判断是否可以正确打开
if 影片.isOpened():
打开,帧=影片.read()
else:打开=False
## 拆分 组合
while 打开:
打开,帧=影片.read()
if 帧 is None:
break
if 打开 is True:
cv2.imshow("gray",帧)
if cv2.waitKey(25)&0xFF==27: # 键盘ESC(27)退出, 否则等待25毫秒
break
影片.release() # 内存释放
cv2.destroyAllWindows() # 关闭全部窗