Python cv2 (一) 基础 参数 详解

摘要 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()
    ifis None:
        break
    if 打开 is True:
        cv2.imshow("gray",)
        if cv2.waitKey(25)&0xFF==27: # 键盘ESC(27)退出, 否则等待25毫秒
            break
影片.release() # 内存释放
cv2.destroyAllWindows() # 关闭全部窗

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在图像处理和计算机视觉中,模板匹配是一种常见的技术,它可以用于在一张图像中查找另一张小图像的位置。在OpenCV中,cv2.matchTemplate()函数可以用于实现模板匹配。下面是该函数的详细解释。 ```python cv2.matchTemplate(image, templ, method[, result[, mask]]) ``` 参数说明: - image:输入图像,即待搜索的图像(大图像)。 - templ:模板图像,即要在输入图像中查找的小图像。 - method:匹配方法,可选值包括:cv2.TM_SQDIFF、cv2.TM_SQDIFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED。具体含义可以参考OpenCV官方文档。 - result:输出的匹配结果图像,数据类型为浮点型。 - mask:可选的蒙板图像,用于指定搜索区域。 返回值: - res:匹配结果矩阵,即每个像素的匹配得分。 使用cv2.matchTemplate()函数的基本流程如下: 1. 加载原始图像和模板图像。 2. 使用cv2.matchTemplate()函数进行模板匹配,得到匹配结果矩阵。 3. 根据匹配结果矩阵找到最佳匹配位置。 下面给出一个简单的例子: ```python import cv2 import numpy as np # 加载原始图像和模板图像 img = cv2.imread('original.jpg') template = cv2.imread('template.jpg') # 获取模板图像的宽度和高度 w, h = template.shape[:2] # 使用cv2.matchTemplate()函数进行模板匹配 res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED) # 根据匹配结果矩阵找到最佳匹配位置 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) top_left = max_loc bottom_right = (top_left[0] + w, top_left[1] + h) # 在原始图像中标注匹配位置 cv2.rectangle(img, top_left, bottom_right, (0, 0, 255), 2) # 显示结果 cv2.imshow('Result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上面的例子中,我们首先加载了原始图像和模板图像,然后使用cv2.matchTemplate()函数进行模板匹配,得到匹配结果矩阵。接着,我们根据匹配结果矩阵找到最佳匹配位置,并在原始图像中标注出来。最后,将结果显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值