您现在的位置是:首页 >学无止境 >OpenCV学习小记网站首页学无止境

OpenCV学习小记

Insight. 2023-07-07 12:00:02
简介OpenCV学习小记

🎈🎈记在最前

OpenCV对于图像的处理是基于BGR的,与常规RGB不同,处理时要注意通道顺序,若对图像进行输、保存,需要转为RGB才能使色彩正常显示

🎈🎈图像处理的基本操作

✨读取图像

  • imread()方法用于读取图像
image = cv2.imread(filename, flags)

'''
image = cv2.imread("D:/3.1.jpg") # 路径中不能出现中文
#  "D:/3.1.jpg"等价于"D:\3.1.jpg"
'''

在这里插入图片描述

灰度图像是一种每个像素都是从黑到白,被处理为256个灰度级别的单色图像。256个灰度级别分别用0(纯黑色)~255(纯白色)的数值表示。

✨显示图像

如果能够将这幅图像显示出来,就可以更加直观地看到它。为此,OpenCV提供了imshow()方法、waitKey()方法和destroyAllWindows()方法。

  • imshow()方法用于显示图像
cv2.imshow(winname, mat)

'''
cv2.imshow("NBA",image)
'''

在这里插入图片描述

  • waitKey()方法用于等待用户按下键盘上按键的时间。当用户按下键盘上的任意按键时,将执行waitKey()方法,并且获取waitKey()方法的返回值。
retval = cv2.waitKey(delay)

'''
pkey = cv2.waitKey()    #  无限等待直到按键按下
cv2.waitKey(1000)   #  图像最大显示1s
'''

在这里插入图片描述

  • destroyAllWindows()方法用于销毁所有正在显示图像的窗
cv2.destroyAllWindows()

✅✅✅

读取、输出NBA.png图像,输出触发关闭事件按键(最大等待5s后自动关闭)

import cv2
image = cv2.imread("NBA.png")
cv2.imshow("NBA",image)
pkey = cv2.waitKey(5000)        #  最大等待5s
cv2.destroyAllWindows()
print(pkey)     #  输出触发按键ASCII码


'''
#  常用图像输出(输出图像,按下任意键关闭)
cv2.imshow("NBA",image)
cv2.waitKey()
cv2.destroyAllWindows()
'''

✨保存图像

  • imwrite()方法用于按照指定路径保存图像
cv2.imwrite(filename, img)

'''
import cv2
image = cv2.imread("3.1.jpg") # 读取3.1.jpg
#  把3.1.jpg保存为E盘根目录下的、Pictures文件夹中的1.jpg
cv2.imwrite("E:/Pictures/1.jpg", image)
'''

在这里插入图片描述

✨获取图像属性

OpenCV提供了shape、size和dtype 3个常用属性

在这里插入图片描述
在这里插入图片描述

import cv2

image = cv2.imread("NBA.png")
print("彩色图像属性:")
print("Shape:",image.shape)
print("Siza:",image.size)
print("Dtype:",image.dtype)

image1 = cv2.imread("NBA.png",0)
print("灰色图像属性:")
print("Shape:",image1.shape)
print("Siza:",image1.size)
print("Dtype:",image1.dtype)

'''
(500, 667, 3)的含义是NBA.png的垂直像素是500,水平像素是667,通道数是3。
(500, 667)的含义是NBA.png转换的灰度图像的垂直像素是500,水平像素是667,通道数是1。
'''

在这里插入图片描述

🎈🎈像素的操作

像素是图像的最小单位。每一幅图像都是由M行N列(对应像素下标[0 ~ M-1,0 ~ N-1])的像素组成的,其中每一个像素都存储一个像素值。以灰度图像为例,计算机通常把灰度图像的像素处理为256个灰度级别,256个灰度级别分别使用区间[0, 255]中的整数数值表示。其中,“0”表示纯黑色;“255”表示纯白色。

✨像素

🔔获取像素的BGR值

  • 同时获取
import cv2

image = cv2.imread("NBA.png")
px = image[200, 230]		# 坐标(200, 230)上的像素
print(px)

'''
[ 72  92 100]
'''
  • 分别获取
import cv2

image = cv2.imread("NBA.png")
B = image[200, 230, 0]
R = image[200, 230, 1]
G = image[200, 230, 2]
print('B:',B)
print('R:',R)
print('G:',G)


'''
B: 72
R: 92
G: 100
'''

🔔修改像素的BGR值


✅✅✅ 将图中的坐标(241, 168)、(241, 218)、(291, 168)和(291, 218)的4个点所围成的区域内的所有像素都修改为纯白色
import cv2
image = cv2.imread("NBA.png")
for i in range(241, 292):
    for j in range(168, 219):
        image[i][j] = 255
cv2.imshow('NBA',image)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

✨使用NumPy模块操作像素

🔔NumPy综述

NumPy更像是一个魔方,它是Python数组计算、矩阵运算和科学计算的核心库,NumPy来源于
Numerical和Python两个单词。NumPy提供了一个高性能的数组对象,以及可以轻松创建一维数组、二维数组和多维数组等大量实用方法,帮助开发者轻松地进行数组计算,从而广泛地应用于数据分析、机器学习、图像处理和计算机图形学、数学任务等领域中。由于NumPy是由C语言实现的,所以其运算速度非常快。

🔔NumPy数据类型

为了区别于Python数据类型,NumPy中的bool、int、float、complex等数据类型名称末尾都加了短下画线“_”

在这里插入图片描述

每一种数据类型都有相应的数据转换方法
np.int8(3.141)
np.float64(8)
np.float(True)

🔔创建数组

  • 最常规的array()方法
numpy.array(object, dtype, copy, order, subok, ndmin)

在这里插入图片描述
在这里插入图片描述

import numpy as np

list = [1, 2, 3]

n1 = np.array(list) #  创建一个简单的一维数组
n2 = np.array([0.1, 0.2, 0.3]) #  创建一个包含小数的一维数组
n3 = np.array([[1, 2], [3, 4]]) #  创建一个简单的二维数组


''' 创建浮点型数组 '''
n4 = np.array(list, dtype=np.float_) #  创建一个浮点型数组
n4 = np.array(list, dtype=float) #  效果同上


''' 创建三维数组 '''
nd3 = np.array(list, ndmin=3) #  创建三维数组

print(n1)
print(n2)
print(n3)
print(n4)
print(n4.dtype)
print(type(n4[0]))
print(nd3)

在这里插入图片描述

  • 创建指定维度和数据类型未初始化的数组

创建指定维度和数据类型未初始化的数组主要使用empty()方法,数组元素因为未被初始化会自动取随机值。如果要改变数组类型,可以使用dtype参数,如将数组类型设为整型,dtype=int。

import numpy as np
n = np.empty([2, 3])
print(n)

'''
[[0.   0.15 0.25]
 [0.5  0.75 1.  ]]
'''
  • 创建用0填充的数组

创建用0填充的数组需要使用zeros()方法,该方法创建的数组元素均为0,OpenCV经常使用该方法创建纯黑图像。

import numpy as np
n = np.zeros((3, 3), np.uint8)
print(n)

'''
[[0 0 0]
 [0 0 0]
 [0 0 0]]
'''
  • 创建用1填充的数组

创建用1填充的数组需要使用ones()方法,该方法创建的数组元素均为1。OpenCV经常使用该方法创建纯掩模、卷积核等用于计算的二维数据。

import numpy as np
n = np.ones((3, 3), np.uint8)
print(n)

'''
[[1 1 1]
 [1 1 1]
 [1 1 1]]
'''
  • 创建随机数组
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。