Opencv缘起

概要

本篇文章主要讲了 Opencv介绍、发展历程、图像的基本操作、像素基本操作、NumPy处理像素。后续内容还会继续再更,有需要的伙伴可以支持一下,哈哈哈,本人也只是一个小小白!没太多华丽的辞藻,纯干货,纯入门完全可以看看。

OpenCV介绍

Python是当下热门的一种编程语言,语法简洁、功能强大。OpenCV是一个开源的计算机视觉库,
能够让开发人员更专注处理图像本身,而非处理图像时的具体实现算法。也就是说,OpenCV让结
构复杂的计算机视觉应用变得非常容易。因此,OpenCV被广泛地应用于各个领域。本章将从Pyth
on出发,途经OpenCV,走进Python OpenCV。

OpenCV的目标是提供一系列易用、高效和可扩展的图像处理和计算机视觉算法,以满足广泛的应用需求。它涵盖了从基本的图像处理任务(如滤波、边缘检测、颜色空间转换)到复杂的计算机视觉算法(如目标检测、特征提取、三维重建)的各个方面。
OpenCV的主要特点包括:

  1. 跨平台支持:可以在不同的操作系统上运行,并提供针对各种硬件平台的优化版本。
  2. 多语言支持:OpenCV支持C++、Python、Java等多种编程语言,方便开发者使用自己熟悉的语言进行图像处理和计算机视觉开发。
  3. 强大的图像处理功能:OpenCV提供了丰富的图像处理函数和算法,如图像过滤、形态学操作、图像变换和几何校正等。
  4. 计算机视觉算法支持:OpenCV包含了许多计算机视觉算法,如特征检测和描述、图像分割、目标检测和跟踪、相机标定等。
  5. 高性能和优化:OpenCV通过使用优化的算法和底层实现,提供了高性能的图像处理和计算机视觉功能。
  6. 开放源代码:OpenCV采用BSD许可证,可以免费使用和修改,同时也鼓励用户进行贡献。
    OpenCV已经成为计算机视觉领域最受欢迎的开源库之一,它在学术界和工业界广泛应用于各种图像处理和计算机视觉应用,如机器视觉、人脸识别、物体检测、视频分析等。无论是学术研究还是商业开发,OpenCV都提供了丰富的功能和工具,帮助开发者更轻松地进行图像处理和计算机视觉应用的开发。

发展历程

在这里插入图片描述
OpenCV的发展历程:

  1. OpenCV 1.x 版本(2000年):OpenCV最初由Intel于1999年开发,早期版本为1.x系列。这些早期版本主要包含一些基本的图像处理和计算机视觉功能,如图像加载、保存、转换、滤波等。
  2. OpenCV 2.x 版本(2009年):OpenCV 2.x版本是较大的重大版本更新,其中引入了许多重要的变化和增强功能。该版本支持多个操作系统平台,包括Windows、Linux、Mac等。此外,OpenCV2.x 还引入了新的模块、工具和接口,并对性能进行了优化。
  3. OpenCV 3.x 版本(2015年):OpenCV 3.x版本是另一个重大版本更新,引入了更多的功能和改进。其中最显著的变化是引入了新的C++接口,以及增加了更多的机器学习算法和深度学习模块。此外,OpenCV3.x 还提供了更好的性能和对新硬件平台(如ARM)的支持。
  4. OpenCV 4.x 版本(2018年):OpenCV 4.x版本是当前最新的稳定版本。该版本引入了一些新的功能和改进,包括对C++11标准的更好支持、DNN模块的改进、对CUDA加速的改进等。OpenCV4.x 还引入了OpenCV Contrib模块,其中包含一些实验性和非标准的功能。
  5. OpenCV 5.x 版本:OpenCV 的未来版本OpenCV 5.x正在开发中,预计会继续提供更多的功能增强和改进。这包括更好的深度学习集成、更快的图像处理和计算、更多的硬件支持等。

OpenCV 在过去的几年中迅速发展,并成为计算机视觉领域最受欢迎的库之一。它广泛应用于图像处理、目标检测与跟踪、人脸识别、机器学习和深度学习等领域。

图像的基本操作

基本操作我大致理解为四步:读显保获

读:

即读取数据

import cv2                        #导入opencv库
image = cv2.imread("photo.jpg")   #同路径下

结果展示:
在这里插入图片描述
这个结果表示 :它是一个3D数组,每个子数组代表一行像素,每个元素表示一个像素点的RGB(红绿蓝)值。RGB是一种表示颜色的方式,其中红、绿、蓝三种基本颜色的不同强度组合在一起形成了各种颜色。
例如,对于第一个子数组[[254 254 254] [254 254 254] [254 254 254] … [254 254 254] [254 254 254] [254 254 254]] ,它表示了一行像素,每个像素的RGB值分别为(254,254,254),(254,254,254),(254,254,254), … , (254,254,254),(254,254,254),(254,254,254).

显:

即显示图片

import cv2                               #导入opencv库
image = cv2.imread("photo.jpg")          #同路径下
cv2.imshow("Ping",image)                 #显示图片
cv2.waitKey()                            #按下任何键盘按键后
cv2.destroyAllWindows()                  #销毁所有窗口

结果展示:
在这里插入图片描述

保:

即保存图片

import cv2
image = cv2.imread("photo.jpg")
cv2.imwrite("C:/Users/ping/Desktop/photo.jpg",image)     #保存路径

结果展示:
在这里插入图片描述

获:

即获取数据

import cv2
image_color = cv2.imread("photo.jpg") 
print("shape = ",image_color.shape)      # 图像的形状
print("size = ",image_color.size)        # 图像的大小
print("dtype = ",image_color.dtype)      # 图像的类型

在这里插入图片描述
说明:
shape = (266,474,3) 表示该彩色图像具有266行、474列和3个颜色通道(红、绿、蓝)
size = 378252 将图像的行数与列数相乘得到的,像素的总数
dtype = uint8 图像数据的类型,uint8是一种无符号8位整数类型,范围为(0-255)

函数说明:

  1. cv2.imshow(winname, mat)
    winname:窗口名称 mat:要显示的图像

  2. cv.imread(filename, flags)

    filename:文件路径
    flags:可选值:
    ①:cv2.IMREAD_COLOR:默认值,彩色模式,可用数字1代替
    ②:cv2.IMREAD_GRAYSCALE:灰度模式,可用数字0代替
    ③:cv2.IMREAD_UNCHANGED:alpha 通道模式,可用数字-1代替

  3. cv.waitKey(delay)
    delay:等待用户按键的时间(以毫秒为单位)。如果指定为 0,则表示无限期等待,直到用户按下键为止。
    函数返回一个整数值,而我们可以利用这个返回值做条件判断:
    如:key = cv2.waitKey(0) # 等待按键
    if key == ord(‘w’): # 按下"W"键
    cv2.destroyAllWindows() # 关闭窗口

  4. cv2.destroyAllWindows()
    关闭所有已打开的图像窗口。该函数没有任何参数,它会遍历当前程序中的所有图像窗口,并将它们全部关闭。

像素基本操作

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

获取像素值

import cv2
image = cv2.imread("photo.jpg")
px = image[10,10]      # 获取坐标为(10, 10)上的像素
print(px)

结果展示:
在这里插入图片描述

修改像素值

import cv2
image = cv2.imread("photo.jpg")
cv2.imshow("Ping",image)
for i in range(10,100):
	for j in range(10,100):
		image[i,j] = [255,255,255]
cv2.inshow("Ping",image)
cv2.waitKey()
cv2.destroyAllWindows()

结果展示:
在这里插入图片描述

创建图像

创建图像是图像识别的第一步,没有图什么都做不了

import cv2
import numpy as np
img = np.ones((200,200),np.uint8)  # 把ones换成zeros即变黑
cv2.imshow("Ping",img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

修改图像

例1:
在图片上添加色块:

import cv2
import numpy as np
img = cv2.imread("C:/Users/ping/Desktop/photo.jpg")
img[25:75][50:100] = 255  # 再上一块区域
cv2.imshow("Ping",img)
cv2.waitKey()
cv2.destroyAllWindows()  

结果展示:
在这里插入图片描述
例2:
黑白相间

import cv2
import numpy as np
img = np.zeros((500,500))
for i in range(10,450,50):
	img[0:500,i+30:i+60]=1    # 高 ,长
cv2.imshow("Ping",img)
cv2.waitKey()
cv2.destroyAllWindows()

结果展示:
在这里插入图片描述
例3:
纯色图块

import cv2
import numpy as np
img = np.zeros((300,3003))
blue = img.copy()
blue[:,:,0] = 255      # 1通道所有像素都为255
green= img.copy()
green[:,:,1] = 255     # 2通道所有像素都为255
red= img.copy()
red[:,:,2] = 255       # 3通道所有像素都为255
cv2.imshow("Blue",blue)
cv2.imshow("Green",green)
cv2.imshow("Red",red)
cv2.waitKey()
cv2.destroyAllWindows()

结果展示:
在这里插入图片描述
例4
随机彩色图像

import cv2
import numpy as np
img = cv2.random.randint(0,256,size=(200,200,3),dtype=np.uint8)  
cv2.imshow("Piny",img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

拼接图像

两张图片上下,左右拼接

import cv2
import numpy as np
img1 = cv2.imread("C:/Users/ping/Desktop/photo.jpg")  
img2 = cv2.imread("C:/Users/ping/Desktop/photo.jpg") 
img_h = np.hstack((img1,img2))
img_v = np.vstack((img1,img2))
cv2.imshow("Ping,img_h")
cv2.imshow("Ping,img_v")
cv2.waitKey()
cv2.destroyAllWindows()

效果展示:
在这里插入图片描述

函数说明:

  1. image[y][x]
    获取图像在(x,y)处的像素值,结果为一个包含Blue,Green,Red三个通道的数组
  2. np.zeros(shape, dtype=float, order=‘C’)
    数组中的元素类型默认为浮点数。如果想要创建整数类型的数组,可以通过指定 dtype 参数来实现,例如np.zeros((3, 4), dtype=int)
  3. numpy.random.randint(low, high=None, size=None, dtype=int)
    low:生成的随机整数的下界(包含)
    high(可选):生成的随机整数的上界(不含)
    size(可选):指定生成随机整数的形状(维度)
    dtype(可选):指定生成随机整数的数据类型,默认为 int。
  4. numpy.hstack(tup)
    tup:一个包含 要连接的数组的元组或列表,用于在水平方向上将多个数组连接起来
  5. numpy.vstack(tup)
    tup:一个包含 要连接的数组的元组或列表,用于在垂直方向上将多个数组连接起来

NumPy处理像素

NumPy介绍

NumPy(Numerical Python)是一个用于处理数值计算的Python库。它提供了一个高性能的多维数组对象(ndarray)以及用于处理这些数组的各种函数和工具。
NumPy的主要功能包括:

  1. 多维数组对象:ndarray 是NumPy的核心数据结构,它表示N维的数组,可以包含相同类型的数据。
  2. 数组操作:NumPy提供了广泛的数组操作函数,可以进行索引、切片、形状操作、排序、合并等。
  3. 向量化操作:NumPy通过广播(broadcasting)机制,支持对数组进行逐元素的数学运算,而无需编写显示循环。
  4. 线性代数运算:NumPy提供了线性代数运算的函数,用于求解线性方程组、矩阵分解、特征值计算等。
  5. 随机数生成:NumPy具备生成各种概率分布随机数的函数,如均匀分布、正态分布等。
  6. 文件读写:NumPy可以读写数组数据到磁盘,支持文本文件、二进制文件等格式。
    使用NumPy可以有效地进行数值计算和科学计算,特别是对于大规模数据和数值运算的场景。
为什么import numpy as np 而不是直接import numpy

当初,面对这个问题我也一直存在疑惑,为啥不直接import numpy,而是还要 import numpy as np ,同样都是要导入numpy库。如此操作,不是还多此一举了嘛。随着后面慢慢的了解,才知道,这种做法是为了方便在代码中使用NumPy的函数和工具。通过给NumPy库指定一个短的别名,我们可以更加简洁地调用NumPy的功能,减少了代码的冗余,并且提高了代码的可读性。

NumPy 基础操作

数组创建

使用np.array()函数创建一个一维或多维数组。
使用np.zeros()创建一个全零数组。
使用np.ones()创建一个全一数组。
使用np.arange()创建一个指定范围的数组。
使用np.random.rand()创建一个指定形状的随机数组

import numpy as np
n1 = np.array([1,2,3])         # 创建一维数组
n2 = np.array([0.1,0.2,0.3])
print(n1)
# 输出:[1 2 3]
print(n2)
# 输出:[0.1 0.2 0.3]
n3 = np.array([1,2],[3,4])     # 创建二维数组 
print(n3)
# [[1 2 3][4 5 6]]
n4 = np.array([1,2,3,4,5],dtype = float) # 创建指定数据类型的数组
print(n4)
# [1. 2. 3. 4. 5.]   
n5 = np.array(range(1,6))  # 创建指定范围内的数字组成的数组
print(n5)
# [1 2 3 4 5]
n6 = np.zeros((100,100),np.uint8)  # 创建一个100*100的全零数组
n7 = np.ones((100,100),np.uint8)   # 创建一个100*100的全一数组
n8 = np.random.randint(1,3,10)     # 生成十个1-2之间的数
print(n8)     
# [2 1 1 2 2 2 1 1 2 2]
n9 = np.random.randint(5,size=(2,5)) # 5以内数,填充到2行5列的二维数组中
print(n9)
# [[4 0 4 2 1] [0 0 4 0 2]]

数组运算
import numpy as np
n1 = np.array([1, 2])  # 创建一维数组
n2 = np.array([3, 4])  # 创建一维数组
print(n1 + n2)  # 加法运算
print(n1 - n2)  # 减法运算
print(n1 * n2)  # 乘法运算
print(n1 / n2)  # 除法运算
print(n1 ** n2)  # 幂运算
元素比较
import numpy as np
n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1 >= n2)    
print(n1 == n2)
print(n1 <= n2)
print(n1 != n2)

结果展示:
在这里插入图片描述

索引切片

跟python中的索引切片大差不差

一维情况下:
import numpy as np
n = np.array([0,1,2,3,4,5,6,7,8,9])
print(n)
print(n[:3])          # 1 2
print(n[3:6])         # 3 4 5
print(n[6:])          # 6 7 8 9
print(n[::])          # 0 1 2 3 4 5 6 7 8 9
print(n[:])           # 1 2 3 4 5 6 7 8 9
print(n[::2])         # 0 2 4 6 8
print(n[1::5])        # 1 6
print(n[2::6])        # 2 8
#start、stop、step为负数时
print(n[::-1])        # 9 8 7 6 5 4 3 2 1 0
print(n[:-3:-1])      # 9 8
print(n[-3:-5:-1])    # 7 6
print(n[-5::-1])      # 5 4 3 2 1 0

结果展示:
在这里插入图片描述

多维情况下:
import numpy as np

# 创建3行4列的二维数组
n = np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])
print(n[1])        # 获取第二个元素的内容
print(n[1, 2])     # 获取第二元素的第三个值 
print(n[-1])       # 获取最后一个元素的内容

结果展示:
在这里插入图片描述

函数说明:
  1. np.array()
    np.array() 函数可以接受多种参数,用于创建 NumPy 数组。以下是 np.array() 的常用参数说明:
    ①:object:输入数据,可以是Python列表、元组、其他序列对象,或者其他数组对象。
    ②:dtype:可选参数,用于指定数组的数据类型。默认情况下,NumPy 会根据输入数据自动推断数据类型。
    ③:copy:可选参数,默认为 True。如果设置为 False,表示复制数据时不进行复制操作。
    ④:order:可选参数,用于表示数组的存储顺序,可以是 ‘C’(按行存储)或 ‘F’(按列存储)。
    ⑤:subok:可选参数,默认为 False。如果设置为 True,表示返回一个与基类类型兼容的子类数组。
    ⑥:ndmin:可选参数,用于指定数组的最小维度。
    太多参数了,就不赘述了,见到一次学一次吧,哈哈哈!

emm…先介绍到这里吧…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值