目录
1.OpenCV介绍
OpenCV(开放源代码计算机视觉库)是一个开源的计算机视觉和机器学习软件库。由一系列 C++ 类和函数构成,用于图像处理、计算机视觉领域的算法实现。
1.1OpenCV优势
-
开源免费:完全开源,可以自由使用,降低开发成本和技术门槛。
-
多语言支持:除C++原生接口外,还支持Java、Python等编程语言。
-
跨平台:支持多种操作系统,Windows、Linux、ios、Android等,方便开发和部署。
-
丰富API:完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。
1.2 OpenCV-Python
OpenCV-Python是原始OpenCV C++实现的Python包装器。它结合了 OpenCV C++ API 的高性能与 Python 语言的易用性和简洁性。通过 OpenCV-Python,开发者可以轻松地进行图像处理、计算机视觉任务以及机器学习应用。
与C / C++等语言相比,Python速度较慢。Python可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。
OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。
2.图像
2.1图像表示
- 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。
- 计算机采用0/1编码的系统,数字图像也是利用0/1来记录信息,我们平常接触的图像都是8位数图像。opencv中常用的是8位图像,大多数彩色和灰度图像使用8位表示每个通道的像素值,范围从0到255,其中0,代表最黑,1,表示最白。
- 日常生活中常见的图像是RGB三原色图。 在计算机中,RGB三种颜色被称为RGB三通道,每个通道的取值都是0-255,根据这三个通道存储的像素值,来对应不同的颜色。
2.2图像存储
在OpenCV中,无论是读取还是创建图像,结果都是一个NumPy数组。
-
彩色图像:三维数组
-
灰度图像:二维
图像本质上是像素值的二维或三维矩阵(对于彩色图像)。
-
形状(Shape):图像的尺寸由其高(height)、宽(width)和通道数(channels)决定。可以通过
img.shape
属性获取这些信息。-
对于彩色图像(如RGB),返回的是一个包含三个值的元组 (height, width, channels)。
-
对于灰度图像,返回的是一个包含两个值的元组 (height, width),因为灰度图像只有一个通道。
-
-
数据类型(dtype):图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。
-
像素表示
-
单通道图像(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低(接近0),颜色越暗;值越高(接近255),颜色越亮。
-
多通道图像(彩色图像): 在OpenCV中,默认情况下,彩色图像是以BGR(蓝-绿-红)顺序存储
-
3. 基本图像操作
3.1创建窗体
cv2.namedWindow(winname [,窗口属性])
使用
cv2.namedWindow()
方法创建一个新的窗口。你可以为这个窗口指定一个名称,并且可以选择窗口的属性(例如,是否可调整大小)。参数:
winname
:窗口名窗口属性:窗口大小是否可调整
cv2.WINDOW_AUTOSIZE
:默认,窗口会根据加载的图像自动调整到合适的大小,并且用户不能拖动窗口边缘来调整窗口大小。
cv2.WINDOW_NORMAL
:窗口大小是可调整的,用户可以通过鼠标拖动窗口边缘来自由改变窗口大小。
3.2读取图像
cv2.imread(path [,读取方式])
参数:
filename:图像路径
读取方式:彩色·默认、灰色等
./
表示当前目录。
../
表示当前目录的上一级目录(即父目录)。当你需要引用或访问当前目录所在位置的上一层目录中的文件或文件夹时使用../
。
import cv2 as cv
#读取图像
cat=cv.imread("../images/images/1.jpg")
3.3显示和保存图像
cv2.imshow(winname,img)
参数:
winname:显示图像的窗口名,以字符串类型表示
img:要显示的图像
注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。
cv2.imwrite(path,img)
参数:
path:图片保存的路径和图片名
img:要保存的图像
代码演示:
import cv2 as cv
# 读取cv.imread(path)
cat = cv.imread("../images/images/1.jpg")
cat1 = cv.imread('D:/华清培训/AI250601_opencv/day01_code/images/1.jpg',cv.IMREAD_GRAYSCALE)
print(cat)
print(cat.shape)
print(cat.dtype)
cv.imshow('myimg', cat)
cv.waitKey(0)
# 释放资源
cv.destroyAllWindows()
3.4创建黑白图像和裁剪
裁剪:
Opencv中,图像切片用于从图像中提取一个子区域(矩形区域)。
假设你有一个图像
img
,它的类型是numpy.ndarray
。img[y:y+h,x:x+w]
的含义如下:
x:子区域左上角的x坐标
y:子区域左上角的y坐标
w:子区域的宽度
h:子区域的高度
切片操作
img[y:y+h,x:x+w]
提取的是从(x,y)
开始,高度为h
,宽度为w
的矩形区域
import cv2 as cv
#读取图像
cat=cv.imread("../images/images/1.jpg")
#切片 arr[h1:h2:w1:w2] h2=h1+h 289. 231 368. 297 w,h
eye=cat[231:297,289:368]
cv.imshow("dst",eye)
cv.waitKey(0)
cv.destroyAllWindows()
黑白图像:
使用
np.zeros()
创建全黑图像,再修改像素值成为全白图像。
numpy.zeros((height,width,channels),dtype=np. uint8)
import numpy as np
import cv2 as cv
#创建全0数组 表示黑色图像
height=360
width=480
c=3
black=np.zeros((height,width,c),dtype=np.uint8)
cv.imshow("black",black)
cv.waitKey(0)
cv.destroyAllWindows()
3.5 图像大小调整
cv2.resize
是Opencv库中用于调整图像大小的函数,在图像处理中很常用,特别是在要对图像进行缩放以适应不同需求时。cv2.resize(img,dsize)
img:输入图像,通常是二维或三位NumPy数组。
dsize:输出图像的尺寸,是一个二元组
(w,h)
,
import cv2 as cv
#读収阁像
pig=cv.imread("../images/images/pig.png")
print(pig.shape)
# 调正图像大小cv.resize(img,(w,h))
cv.resize(pig, (480,520))
cv.imshow("old",pig)
cv.waitKey(0)
cv.destroyAllWindows()
4.图像绘制
(1) 绘制直线
cv2.line(img,sart,end,color,thickness)
参数
img:要绘制直线的图像
start、end:直线的起点和终点
color:直线的颜色(对于彩色图像,使用 BGR 格式指定颜色)
thickness:线条宽度
(2) 绘制圆形
cv2.circle(img,centerpoint,r,color,thickness)
参数:
img:要绘制圆形的图片
centerpoint、r:圆心和半径
color:线条颜色
tnickness:线条宽度,为-1时生成闭合图案并填充颜色
(3) 绘制矩形
cv2.rectangle(img,leftupper,rightdown,color,thickness)
参数:
img:要绘制矩形的图像
leftupper、rightdown:矩形的左上角和右下角坐标
color:线条的颜色
thickness:线条的宽度
import cv2 as cv
cat=cv.imread("../images/images/1.jpg")
#绘制直线 cv2.line(img,sart,end,color,thickness)(w,h)
cv.line(cat,(50,40),(80,40),(100,200,255),2)
#绘制矩形 cv2.rectangle(img,lefttop.rightbottom,color,thickness=1:填充)
cv.rectangle(cat,(78,106),(237,306),(0,255,0),-1)
# 绘制圆 cv2.circle(img,center,r,color,thickness)
#CV.LINE_AA 反走样技术 抗锯齿 平滑 默认使用的是LINE_8
cv.circle(cat,(325,269),30,(0,0,255),2,cv.LINE_AA)
cv.imshow("cat",cat)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果