OpenCV:
是由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法
OpenCV-Python:
OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。
Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和代码可读性。它使程序员能够用更少的代码行表达思想,而不会降低可读性。
与C / C++等语言相比,Python速度较慢。Pytho n可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。这给我们带来了两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。OpenCV-Python是原始OpenCV C++实现的Python包装器。
OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。
安装opencv-python:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
opencv基础的图像操作:
读取图像:
语法:
import cv2
img = cv2.imread(path,方式)
path:读取图片的路径
方式:默认为彩色图像,也可选择灰度图等等
显示图像:
语法:
import cv2
cv2.imshow(arg1,arg2)
cv2.waitkey(0) #图像显示后等待键入后关闭窗口,0无限等待
arg1:显示图像的窗口的名称,格式为字符串
arg2:要显示的图片
注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来
保存图像:
语法:
import cv2
cv2.imwrite(arg1,arg2)
arg1:保存的路径及名称,格式为字符串
arg2:要保存的图片
示例:
import cv2img = cv2.imread('test.jpg')
cv2.imshow('test',img)
cv2.imwrite('test1.jpg',img)
cv2.waitkey(0)
绘制图形:
绘制直线:
语法:
cv2.line(img,start,end,color,thickness)
img:要绘制直线的图片
start:直线的起点
end:直线的终点
color:线条的颜色
thickness:线条的粗细
示例:
import cv2img = cv2.imread('test.jpg')
cv2.line(img, (100, 100), (200, 200), (255, 0, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
绘制圆形:
语法:
cv.circle(img,centerpoint, r, color, thickness)
centerpoint:绘制圆形的圆心位置
r:绘制圆形的半径
绘制矩形:
语法:
cv.rectangle(img,leftupper,rightdown,color,thickness)
leftupper:要绘制矩形的左上角位置
rightdown:要绘制矩形的右下角位置
向图像中添加文字:
语法:
cv.putText(img,text,station, font, Fontscale ,color,thickness,cv2.LINE_AA)
text:要添加的文字
station:添加文字的位置
font:字体样式
Fontscale:字体大小
cv2.LINE_AA:
表示使用反走样(Anti-Aliasing)技术来绘制文本边框。反走样是一种提高图形质量的技术,它通过混合颜色和像素边缘以减少锯齿状效果,使文本看起来更加平滑、清晰。
示例:
import cv2img = cv2.imread('test.jpg')
cv2.putText(img, 'OpenCV', (100, 200), cv2.FONT_ITALIC, 1, (255, 255, 0), 4, cv2.LINE_AA)
cv2.imshow("img", img)
cv2.waitKey(0)
捕获摄像头的实时视频流:
语法:
import cv2cap = cv2.VideoCapture(path)
ret, frame = cap.read()
path:path视频流资源路径设置为0代表从默认摄像头捕获视频流
返回值cap 调用read()方法可以得到一个布尔值和一帧图像。布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败;如果为True,第二项则是当前帧的图像数据。
示例:
import cv2# 创建VideoCapture对象,参数为摄像头索引(通常为0,如果是单一摄像头)
cap = cv2.VideoCapture(0)
while True:# 读取一帧视频ret, frame = cap.read()# 检查读取是否成功if not ret:break# 在这里处理或显示帧(例如,显示原始帧)cv2.imshow('Camera Feed', frame)# 按'ESC'键退出循环if cv2.waitKey(1) & 0xFF == 27:break
# 释放摄像头资源并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
计算机中的图像:
像素:
像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,例如,1920x1080分辨率的图像表示横向有1920个像素,纵向有1080个像素,总计约207万个像素。
日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,根据这三个通道存储的像素值,来对应不同的颜色。
图像:
在计算机中,图像是由像素组成的二维矩阵,每个像素包含颜色和亮度信息。图像可以是黑白的、灰度的或彩色的,具体取决于每个像素存储的信息类型。
二值图像:
二值图像是最简单的图像类型,每个像素只有两种可能的取值:0 或 1。通常,0 表示黑色,1 表示白色。
特点:
-
每个像素仅用 1位(1 bit)存储。
-
图像中只有黑白两种颜色,没有灰度过渡。
-
数据量非常小,处理速度快
灰度图像:
灰度图像的每个像素表示一个灰度级别,通常范围是 0 到 255。0 表示纯黑色,255 表示纯白色,中间值表示不同的灰度。
特点:
-
每个像素用 8位(1 字节)存储,可以表示 256 种灰度级别。
-
图像只有亮度信息,没有颜色信息。
-
数据量比彩色图像小,但仍能保留较多的细节。
彩色图像:
定义:
彩色图像的每个像素由 三个颜色通道 组成:红色(R)、绿色(G) 和 蓝色(B)。每个通道的取值范围是 0 到 255,通过这三个通道的组合可以表示丰富的颜色。
特点:
-
每个像素用 24位(3 字节)存储,可以表示约 1677 万种颜色(256 x 256 x 256)。
-
图像包含颜色和亮度信息,视觉效果更真实。
-
数据量较大,处理速度相对较慢。
三者的对比:
特性 | 二值图像 | 灰度图像 | 彩色图像 |
---|---|---|---|
像素值范围 | 0 或 1 | 0 到 255 | 每个通道 0 到 255 |
存储空间 | 每个像素 1 位 | 每个像素 8 位(1 字节) | 每个像素 24 位(3 字节) |
颜色信息 | 黑白 | 灰度 | 彩色 |
数据量 | 最小 | 中等 | 最大 |
应用场景 | 文档扫描、图像分割 | 医学影像、黑白摄影 | 彩色摄影、视频处理 |
灰度实验:
灰度图与彩色图最大的不同就是:彩色图是由R、G、B三个通道组成,而灰度图只有一个通道,也称为单通道图像,所以彩色图转成灰度图的过程本质上就是将R、G、B三通道合并成一个通道的过程,而将彩色图像转换为灰度图像的过程称为灰度化。
最大值法:
原理:取每个像素的 R、G、B 三个通道中的最大值作为灰度值。
公式:
例如:某像素点R=66,G=188,B=72,则该像素点留下最大的值为188
特点:方法简单但是容易丢失细节
平均值法:
原理:将每个像素的 R、G、B 三个通道的值取平均,作为灰度值。
公式:
例如:某像素点R=91,G=121,B=46,则该像素点值为86
特点:简单易实现,但未考虑人眼对不同颜色的敏感度。
加权平均法(常用方法):
原理:根据人眼对颜色的敏感度,对 R、G、B 三个通道赋予不同的权重。通常绿色权重最高,红色次之,蓝色最低。
公式:
例如:某像素点R=91,G=121,B=46,则该点像素值为10*0.299+121*0.587+46*0.114=79。
特点:符合人眼视觉特性,效果较好,但计算量稍大。
二值化实验:
二值化(Binarization)是将图像转换为二值图像的过程。二值图像中,每个像素只有两种可能的取值:0(黑色)或 1(白色)。二值化通过设定一个阈值,将图像的像素值分为两类:高于阈值的像素设为白色(1),低于阈值的像素设为黑色(0)。
二值化的作用:
-
简化图像:
将复杂的灰度或彩色图像转换为只有黑白两种颜色的图像,便于后续处理。 -
分离目标与背景:
在图像分割中,二值化可以有效地将目标物体与背景分离。 -
减少数据量:
二值图像每个像素只用 1 位存储,数据量远小于灰度或彩色图像,适合存储和传输。 -
提高处理效率:
二值图像处理速度快,适合实时应用,如文本识别、二维码扫描等。
阈值法(THRESH_BINARY):
原理:对整个图像使用一个固定的阈值。大于这个阈值则白色,小于这个阈值则黑色
公式:
其中,I(x,y) 是像素点的灰度值,T 是阈值。
例如:如果阈值 T=127,则灰度值大于等于 127 的像素设为白色,小于 127 的像素设为黑色。
特点:简单、计算速度快,但是对光照不均匀的图像效果较差。
反阈值法(THRESH_BINARY_INV):
跟阈值法相反,大于这个阈值则黑色,小于这个阈值则白色
截断阈值法(THRESH_TRUNC):
原理:将高于阈值的像素值截断为阈值,低于阈值的像素值保持不变。这种方法通常用于保留图像的某些细节,同时限制像素值的范围。
公式:
其中:I(x,y) 是输入图像的像素值,T是设定的阈值
例如:设定的阈值为200,像素值127没超过阈值则还是127,像素值220超过阈值则修改为200
特点:低于阈值的像素值保持不变,因此图像的细节部分(如阴影、纹理)不会被丢失,高于阈值的像素值被截断为阈值,可以防止图像过亮。
低阈值零处理(THRESH_TOZERO):
原理:将低于阈值的像素值设为 0(黑色),而高于阈值的像素值保持不变。
公式:
其中:I(x,y) 是输入图像的像素值,T 是设定的阈值。
例如:设定的阈值为127,像素值100小于阈值则修改为0,像素值200大于阈值则还是200
特点:低于阈值的像素值被设为 0,可以有效去除图像中的噪声或背景,高于阈值的像素值保持不变,因此目标物体的细节和亮度信息得以保留。
超阈值零处理(THRESH_TOZERO_INV):
超阈值零处理和低阈值零处理类似,超过阈值的像素值修改为0,低于阈值的则不变
OTSU阈值法:
原理:自动计算最佳阈值,使得两类像素的类间方差最大。
计算图像的灰度直方图,遍历所有可能的阈值,计算类间方差,选择使类间方差最大的阈值。
特点:无需手动设置阈值,适合大多数图像,但计算量较大。
自适应阈值法:
原理:根据图像的局部区域动态计算阈值,适合光照不均匀的图像。
通过将图像分成多个小区域,对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布。
公式:
均值法:T(x,y)=mean(I(x,y))−C
高斯加权法:T(x,y)=GaussianWeightedMean(I(x,y))−C
特点:通过自适应阈值法,可以有效处理光照不均匀的图像,并生成高质量的二值化结果。