OpenCV入门学习(一):基础入门(图像是怎么存在的?)

📅 2026/8/3 4:33:03
OpenCV入门学习(一):基础入门(图像是怎么存在的?)
OpenCV入门学习一基础入门图像是怎么存在的前言本文是OpenCV学习系列的第一篇。我们将从零开始理解计算机眼中的图像究竟是什么以及如何对图像进行最基本的操作。本阶段不涉及复杂的图像处理算法而是打好基础为后续学习铺路。目录一、计算机眼中的图像二、图像读取与显示三、像素与ROI操作四、图像基础绘图五、视频处理基础六、总结一、计算机眼中的图像在学习OpenCV之前首先要理解一个核心问题图像在计算机中是如何存在的1.1 图像的数学本质当你看到一张图片时你看到的是色彩和形状。但在计算机眼中图像只是一个数字矩阵NumPy数组。灰度图一个二维矩阵每个元素代表该像素的亮度值范围通常是0~255。0 黑色255 白色形状为(高度, 宽度)彩色图一个三维矩阵包含三个通道B、G、R。形状为(高度, 宽度, 通道数)每个通道也是一个二维矩阵值范围0~2551.2 为什么是BGR而不是RGBOpenCV在读取图像时默认使用BGR颜色顺序蓝-绿-红而非我们常识中的RGB。这是一个非常容易踩的坑为什么历史原因OpenCV最早是为Intel的图像处理库设计的BGR是当时硬件和Windows GDI的默认格式后续为了兼容性一直沿用至今影响使用cv2.imshow()显示时它会正确解析BGR所以看不出问题但使用Matplotlib等第三方库显示时如果不转换颜色会完全错乱重点记忆OpenCV读图 BGR显示/保存时注意转换1.3 图像的基本属性一张图像包含以下关键属性shape(行数, 列数, 通道数)→ 高度、宽度、颜色深度dtype数据类型通常为uint80~255size总像素数 高度 × 宽度 × 通道数二、图像读取与显示2.1 核心函数函数作用cv2.imread(path, flag)读取图像文件cv2.imshow(winname, mat)显示图像窗口cv2.waitKey(delay)等待键盘输入cv2.destroyAllWindows()关闭所有窗口cv2.imwrite(path, img)保存图像2.2 读取模式详解cv2.imread()的第二个参数flag控制读取方式参数值含义cv2.IMREAD_COLOR或 1读取彩色图BGR默认值cv2.IMREAD_GRAYSCALE或 0读取为灰度图cv2.IMREAD_UNCHANGED或 -1读取包含Alpha通道透明通道的图2.3 基本操作流程importcv2# 1. 读取一张彩色图片imgcv2.imread(yys1.jpg)# 2. 检查读取是否成功ifimgisNone:print(错误图片读取失败请检查文件路径)exit()# 3. 显示图片cv2.imshow(Original Image,img)# 4. 等待按键cv2.waitKey(0)# 5. 打印图像信息print(图像形状(shape):,img.shape)print(图像数据类型(dtype):,img.dtype)print(图像大小(size):,img.size)# 6. 关闭所有窗口cv2.destroyAllWindows()2.4 灰度图读取与保存importcv2# 方式一读取时直接指定为灰度图gray1cv2.imread(yys1.jpg,cv2.IMREAD_GRAYSCALE)# 方式二先读取彩色图再转换为灰度图imgcv2.imread(yys1.jpg)gray2cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 显示原图cv2.imshow(Original,img)# 显示两种方式得到的灰度图cv2.imshow(Gray1 - IMREAD_GRAYSCALE,gray1)cv2.imshow(Gray2 - cvtColor,gray2)# 等待按键cv2.waitKey(0)cv2.destroyAllWindows()# 查看灰度图的shape二维数组print(原图形状:,img.shape)print(方式一灰度图形状:,gray1.shape)print(方式二灰度图形状:,gray2.shape)print(灰度图数据类型:,gray1.dtype)print(灰度图大小:,gray1.size)# 保存灰度图cv2.imwrite(yys1_gray.jpg,gray1)print(灰度图已保存为: yys1_gray.jpg)输出示例原图形状: (384, 256, 3) 方式一灰度图形状: (384, 256) 方式二灰度图形状: (384, 256) 灰度图数据类型: uint8 灰度图大小: 98304 灰度图已保存为: yys1_gray.jpg2.5 路径处理注意事项Windows路径中的反斜杠\需要转义推荐以下写法写法示例原始字符串rC:\Users\xxx\photo\img.png双反斜杠C:\\Users\\xxx\\photo\\img.png正斜杠C:/Users/xxx/photo/img.png相对路径photo/img.png2.6 常见坑点现象原因解决方案img is None路径错误或文件不存在检查路径使用绝对路径窗口闪退没有cv2.waitKey()必须调用等待键盘输入颜色异常BGR/RGB 混淆使用cv2.cvtColor()转换中文路径报错OpenCV不支持中文路径改用英文路径或用cv2.imdecode()三、像素与ROI操作理解了图像是NumPy数组后操作像素就变得非常直观。3.1 像素操作基础图像就是多维数组可以通过索引访问任意像素。核心概念单个像素img[y, x]→ 注意是行(y)在前列(x)在后彩色图返回[B, G, R]三个值灰度图返回单个亮度值索引规则行索引 高度方向从上到下从0开始列索引 宽度方向从左到右从0开始通道索引0B, 1G, 2R3.2 单像素操作importcv2# 1. 读取一张彩色图imgcv2.imread(yys1.jpg)ifimgisNone:print(错误图片读取失败)exit()# 2. 获取位置 (100, 200) 处的像素BGR值pixelimg[100,200]print(f位置 (100, 200) 的像素BGR值:{pixel})# 3. 分别打印三个通道的值print(f蓝色通道(B):{pixel[0]})print(f绿色通道(G):{pixel[1]})print(f红色通道(R):{pixel[2]})# 4. 修改该像素为纯红色 [0, 0, 255]BGR格式img[100,200][0,0,255]print(已将该像素修改为纯红色)# 验证修改后的像素值modified_pixelimg[100,200]print(f修改后位置 (100, 200) 的像素值:{modified_pixel})# 5. 显示修改前后的对比cv2.imshow(Modified Image,img)cv2.waitKey(0)cv2.destroyAllWindows()# # 6. 尝试获取灰度图中单个像素的值# 读取灰度图gray_imgcv2.imread(yys1.jpg,cv2.IMREAD_GRAYSCALE)ifgray_imgisnotNone:gray_pixelgray_img[100,200]print(f\n灰度图位置 (100, 200) 的像素值:{gray_pixel}只有一个数字)print(f灰度图数据类型:{gray_img.dtype})3.3 区域操作ROIROIRegion of Interest感兴趣区域是图像处理中最常用的技术之一。切片语法roiimg[y1:y2,x1:x2]y1:y2→ 行范围高度x1:x2→ 列范围宽度牢记先写行高再写列宽与坐标轴的 (x, y) 习惯相反importcv2importnumpyasnp# 1. 读取一张图片imgcv2.imread(yys1.jpg)ifimgisNone:print(错误图片读取失败)exit()# 获取图像尺寸h,wimg.shape[:2]print(f图像尺寸: 高度{h}, 宽度{w})# 2. 使用切片截取图像中央区域作为ROI# 取图像中央 1/4 区域y1h//4y23*h//4x1w//4x23*w//4roiimg[y1:y2,x1:x2]print(fROI区域尺寸:{roi.shape})# 3. 在原图上标记ROI位置绿色矩形框img_markedimg.copy()# 创建副本cv2.rectangle(img_marked,(x1,y1),(x2,y2),(0,255,0),2)# 4. 分别显示原图带标记和ROI截图cv2.imshow(Original,img_marked)cv2.imshow(roi,roi)# 5. 尝试将ROI区域修改为纯色块或添加噪声# 在副本上操作避免修改原图img_modifiedimg.copy()# 方式一将ROI区域改为纯蓝色块img_modified[y1:y2,x1:x2][255,0,0]# BGR格式蓝色# 方式二或添加随机噪声取消注释使用# noise np.random.randint(0, 256, (y2-y1, x2-x1, 3), dtypenp.uint8)# img_modified[y1:y2, x1:x2] noisecv2.imshow(ROI_blue,img_modified)# 等待按键并关闭窗口cv2.waitKey(0)cv2.destroyAllWindows()输出示例图像尺寸: 高度384, 宽度256 ROI区域尺寸: (192, 128, 3)3.4 ROI的常见应用场景应用场景说明目标检测从大图中提取待检测区域人脸识别截取人脸区域进行处理图像拼接提取重叠区域进行匹配数据增强随机裁剪生成训练样本水印/贴图将小图贴到大图的指定区域四、图像基础绘图OpenCV提供了丰富的绘图函数可以在图像上绘制各种几何图形和文字。这些功能在图像标注、可视化、数据增强中非常实用。4.1 绘图函数速览函数作用关键参数cv2.line()画直线起点、终点、颜色、线宽cv2.rectangle()画矩形左上角、右下角、颜色、线宽cv2.circle()画圆圆心、半径、颜色、线宽cv2.ellipse()画椭圆中心、长轴短轴、角度、颜色cv2.polylines()画多边形点集、是否闭合、颜色cv2.putText()写文字文字内容、位置、字体、大小、颜色4.2 颜色格式OpenCV中颜色使用BGR格式不是RGB颜色BGR值红色(0, 0, 255)绿色(0, 255, 0)蓝色(255, 0, 0)白色(255, 255, 255)黑色(0, 0, 0)黄色(0, 255, 255)青色(255, 255, 0)紫色(255, 0, 255)4.3 线宽参数正数线条的像素宽度cv2.FILLED或-1填充图形内部cv2.LINE_4/cv2.LINE_8/cv2.LINE_AA线条类型AA为抗锯齿4.4 基础绘图示例代码块位置demo_05_draw.py实现功能创建一张纯黑色画布np.zeros((500, 500, 3), dtypenp.uint8)在画布上画一条红色对角线cv2.line()画一个绿色矩形框cv2.rectangle()画一个蓝色实心圆cv2.circle()画一个椭圆cv2.ellipse()画一个多边形cv2.polylines()在图像上写文字cv2.putText()显示最终结果在真实图片上叠加绘制图形4.6 绘图常见用途用途说明数据可视化标注检测框、关键点调试工具标记ROI、显示处理结果数据增强生成合成图像、添加文字教学演示绘制示意图、流程图图像注释添加水印、标题、说明五、视频处理基础5.1 视频处理核心概念视频本质上就是连续的图像帧每一帧都是一张独立的图片。OpenCV通过cv2.VideoCapture()来读取视频流摄像头或视频文件。视频处理的基本流程与图像处理类似只是需要循环处理每一帧。5.2 视频读取基本流程importcv2# 打开摄像头参数0表示默认摄像头video_capturecv2.VideoCapture(0)# 也可以传视频文件# 检查是否成功打开ifnotvideo_capture.isOpened():print(无法打开摄像头)exit()# 循环读取每一帧whileTrue:ret,framevideo_capture.read()ifnotret:break# 对每一帧进行处理示例转换为HSV颜色空间framecv2.cvtColor(frame,cv2.COLOR_BGR2HSV)# 显示处理后的帧cv2.imshow(Video,frame)# 按ESC键退出ifcv2.waitKey(60)27:break# 释放资源video_capture.release()cv2.destroyAllWindows()5.3 核心要点要点说明VideoCapture(0)0表示默认摄像头可替换为视频文件路径cap.read()返回(ret, frame)retTrue表示读取成功循环处理视频处理本质是循环处理每一帧图像退出条件必须设置退出条件避免无限循环资源释放使用完必须调用cap.release()六、总结核心知识点知识点关键函数/语法图像 NumPy数组type(img)BGR格式cv2.cvtColor(img, cv2.COLOR_BGR2RGB)图像属性img.shape,img.dtype,img.size读取/显示/保存cv2.imread(),cv2.imshow(),cv2.imwrite()灰度转换cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)像素操作img[y, x],img[y, x] [B, G, R]ROI切片img[y1:y2, x1:x2]绘图函数cv2.line(),cv2.rectangle(),cv2.circle(),cv2.putText()视频处理cv2.VideoCapture(),cap.read(),cap.release()注意事项要点说明记住BGROpenCV读图是BGR不是RGB行在前列在后img[y, x]img[y1:y2, x1:x2]必须waitKey显示图像后必须调用cv2.waitKey()检查返回值cv2.imread()可能返回Nonecopy保护原图操作前用img.copy()创建副本释放资源视频使用完调用cap.release()系列直达上一篇无本文为系列第一篇本篇 OpenCV入门学习一基础入门图像是怎么存在的下一篇OpenCV入门学习二图像预处理练习建议运行所有示例代码逐行理解尝试修改参数观察效果变化用自己的图片做实验画图时尝试不同的颜色和样式