
OpenCV 图像操作入门从零开始玩转计算机视觉用 Python OpenCV10 个核心操作带你打开计算机视觉的大门 前言OpenCVOpen Source Computer Vision Library是计算机视觉领域最流行的开源库支持 Python、C、Java 等多种语言。无论是图像处理、人脸识别、目标检测还是视频分析OpenCV 都是绕不开的利器。本文以Python OpenCV为例通过 10 个常用操作示例带你快速上手图像处理的核心技能。环境准备安装依赖pipinstallopencv-python numpy matplotlib说明opencv-pythonOpenCV 核心库numpy图像本质上是数组numpy 是基础matplotlib用于在 Jupyter/脚本中可视化展示图像验证安装importcv2importnumpyasnpprint(fOpenCV 版本{cv2.__version__})输出类似OpenCV 版本4.9.0即表示安装成功。基础概念在正式操作之前有两个概念必须先搞清楚图像在 OpenCV 中的本质在 OpenCV 里一张图像就是一个NumPy 多维数组灰度图形状为(height, width)每个像素值范围0~255彩色图形状为(height, width, 3)三个通道分别是B蓝、G绿、R红⚠️ 注意OpenCV 的通道顺序是BGR而不是我们常见的 RGB这是一个高频踩坑点坐标系OpenCV 的坐标原点在左上角x 轴向右y 轴向下。操作一读取、显示与保存图像这是最基础的三板斧。importcv2# 读取图像默认彩色模式imgcv2.imread(example.jpg)# 读取为灰度图img_graycv2.imread(example.jpg,cv2.IMREAD_GRAYSCALE)# 显示图像弹出窗口cv2.imshow(原图,img)cv2.imshow(灰度图,img_gray)# 等待按键后关闭窗口cv2.waitKey(0)cv2.destroyAllWindows()# 保存图像cv2.imwrite(output.jpg,img_gray)print(保存成功)常用读取模式参数说明cv2.IMREAD_COLOR彩色模式默认cv2.IMREAD_GRAYSCALE灰度模式cv2.IMREAD_UNCHANGED原始模式含 Alpha 通道操作二图像基本属性importcv2 imgcv2.imread(example.jpg)# 图像形状(高度, 宽度, 通道数)print(f形状{img.shape})# 例(480, 640, 3)# 像素总数print(f像素总数{img.size})# 例921600# 数据类型print(f数据类型{img.dtype})# uint8# 获取单个像素的 BGR 值pixelimg[100,200]print(f坐标(100,200)的像素B{pixel[0]}, G{pixel[1]}, R{pixel[2]})# 修改单个像素img[100,200][255,0,0]# 改为纯蓝色操作三颜色空间转换importcv2 imgcv2.imread(example.jpg)# BGR → 灰度graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# BGR → RGB用于 matplotlib 显示rgbcv2.cvtColor(img,cv2.COLOR_BGR2RGB)# BGR → HSV色相-饱和度-亮度常用于颜色检测hsvcv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 用 matplotlib 正确显示彩色图importmatplotlib.pyplotasplt plt.figure(figsize(12,4))plt.subplot(1,3,1);plt.imshow(rgb);plt.title(RGB 原图);plt.axis(off)plt.subplot(1,3,2);plt.imshow(gray,cmapgray);plt.title(灰度图);plt.axis(off)plt.subplot(1,3,3);plt.imshow(hsv);plt.title(HSV 图);plt.axis(off)plt.tight_layout()plt.show()小技巧用 matplotlib 显示 OpenCV 图像时记得先把 BGR 转成 RGB否则颜色会蓝红反转。操作四图像缩放与裁剪importcv2 imgcv2.imread(example.jpg)h,wimg.shape[:2]print(f原始尺寸{w}x{h})# --- 缩放 ---# 指定目标尺寸resizedcv2.resize(img,(320,240))# 按比例缩放缩小到 50%halfcv2.resize(img,(0,0),fx0.5,fy0.5)# 放大 1.5 倍使用双三次插值质量更好enlargedcv2.resize(img,(0,0),fx1.5,fy1.5,interpolationcv2.INTER_CUBIC)# --- 裁剪ROI感兴趣区域---# 语法img[y_start:y_end, x_start:x_end]roiimg[50:200,100:300]# 裁剪 y:50~200, x:100~300 的区域cv2.imshow(缩放后,resized)cv2.imshow(裁剪区域,roi)cv2.waitKey(0)cv2.destroyAllWindows()插值方法对比插值方法适用场景cv2.INTER_NEAREST速度最快质量最差cv2.INTER_LINEAR默认双线性速度与质量均衡cv2.INTER_CUBIC双三次放大时质量好cv2.INTER_AREA缩小时效果最佳操作五图像翻转与旋转importcv2 imgcv2.imread(example.jpg)# 翻转flip_hcv2.flip(img,1)# 水平翻转左右镜像flip_vcv2.flip(img,0)# 垂直翻转上下翻转flip_bcv2.flip(img,-1)# 同时水平 垂直翻转# 旋转以图像中心为轴旋转 45 度缩放比例 1.0h,wimg.shape[:2]center(w//2,h//2)Mcv2.getRotationMatrix2D(center,45,1.0)rotatedcv2.warpAffine(img,M,(w,h))cv2.imshow(水平翻转,flip_h)cv2.imshow(旋转45度,rotated)cv2.waitKey(0)cv2.destroyAllWindows()操作六绘制图形与文字OpenCV 提供了丰富的绘图函数常用于标注检测结果。importcv2importnumpyasnp# 创建一块黑色画布500x5003通道canvasnp.zeros((500,500,3),dtypenp.uint8)# 画直线起点、终点、颜色(BGR)、线宽cv2.line(canvas,(50,50),(450,50),(0,255,0),2)# 画矩形左上角、右下角、颜色、线宽-1 表示填充cv2.rectangle(canvas,(100,100),(300,250),(0,0,255),3)# 画圆圆心、半径、颜色、线宽cv2.circle(canvas,(400,350),80,(255,0,0),-1)# 填充蓝色圆# 画多边形ptsnp.array([[250,300],[350,400],[150,400]],dtypenp.int32)cv2.polylines(canvas,[pts],isClosedTrue,color(0,255,255),thickness2)# 写文字文本、位置、字体、字号、颜色、线宽cv2.putText(canvas,Hello OpenCV!,(80,470),cv2.FONT_HERSHEY_SIMPLEX,1.2,(255,255,255),2)cv2.imshow(绘图示例,canvas)cv2.waitKey(0)cv2.destroyAllWindows()操作七图像滤波模糊与锐化滤波是图像预处理的核心步骤用于去噪或增强细节。importcv2 imgcv2.imread(example.jpg)# 均值模糊内核越大越模糊blur_avgcv2.blur(img,(5,5))# 高斯模糊更自然的模糊效果常用于降噪blur_gausscv2.GaussianBlur(img,(5,5),0)# 中值模糊对椒盐噪声效果极好blur_mediancv2.medianBlur(img,5)# 双边滤波保留边缘的同时去噪效果好但速度慢blur_bilateralcv2.bilateralFilter(img,9,75,75)# 锐化使用自定义卷积核importnumpyasnp kernel_sharpennp.array([[0,-1,0],[-1,5,-1],[0,-1,0]])sharpenedcv2.filter2D(img,-1,kernel_sharpen)cv2.imshow(原图,img)cv2.imshow(高斯模糊,blur_gauss)cv2.imshow(锐化,sharpened)cv2.waitKey(0)cv2.destroyAllWindows()操作八边缘检测边缘检测是目标识别的重要前处理步骤。importcv2 imgcv2.imread(example.jpg)graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# Canny 边缘检测最常用# 参数输入图、低阈值、高阈值edges_cannycv2.Canny(gray,50,150)# Sobel 算子分别检测 X、Y 方向边缘sobel_xcv2.Sobel(gray,cv2.CV_64F,1,0,ksize3)sobel_ycv2.Sobel(gray,cv2.CV_64F,0,1,ksize3)sobelcv2.magnitude(sobel_x,sobel_y)sobelcv2.convertScaleAbs(sobel)# Laplacian 算子laplaciancv2.Laplacian(gray,cv2.CV_64F)laplaciancv2.convertScaleAbs(laplacian)cv2.imshow(原图灰度,gray)cv2.imshow(Canny 边缘,edges_canny)cv2.imshow(Sobel 边缘,sobel)cv2.imshow(Laplacian 边缘,laplacian)cv2.waitKey(0)cv2.destroyAllWindows()Canny 参数调优建议低阈值 高阈值 × 1/3高阈值从 100~200 开始尝试。操作九阈值分割与轮廓检测importcv2importnumpyasnp imgcv2.imread(example.jpg)graycv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 全局阈值大于127的像素变白其余变黑_,thresh_globalcv2.threshold(gray,127,255,cv2.THRESH_BINARY)# 自适应阈值对光照不均的图像效果更好thresh_adaptivecv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)# Otsu 自动阈值自动确定最佳阈值_,thresh_otsucv2.threshold(gray,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU)# --- 轮廓检测 ---contours,hierarchycv2.findContours(thresh_otsu,cv2.RETR_EXTERNAL,# 只检测外轮廓cv2.CHAIN_APPROX_SIMPLE)# 在原图上绘制所有轮廓img_contoursimg.copy()cv2.drawContours(img_contours,contours,-1,(0,255,0),2)print(f共检测到{len(contours)}个轮廓)cv2.imshow(Otsu 阈值,thresh_otsu)cv2.imshow(轮廓检测,img_contours)cv2.waitKey(0)cv2.destroyAllWindows()操作十综合实战——提取图像中的红色区域将前面学到的知识组合起来做一个实用的颜色检测小程序。importcv2importnumpyasnpdefdetect_red_region(image_path):检测图像中的红色区域并标注# 1. 读取图像并转换到 HSV 空间imgcv2.imread(image_path)hsvcv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 2. 定义红色的 HSV 范围红色在 HSV 中分两段lower_red1np.array([0,120,70])upper_red1np.array([10,255,255])lower_red2np.array([170,120,70])upper_red2np.array([180,255,255])# 3. 创建掩码mask1cv2.inRange(hsv,lower_red1,upper_red1)mask2cv2.inRange(hsv,lower_red2,upper_red2)maskcv2.bitwise_or(mask1,mask2)# 4. 形态学处理去除噪点kernelnp.ones((5,5),np.uint8)maskcv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)# 开运算去小噪点maskcv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)# 闭运算填补空洞# 5. 找轮廓并绘制边界框contours,_cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)resultimg.copy()forcntincontours:areacv2.contourArea(cnt)ifarea500:# 过滤掉太小的区域x,y,w,hcv2.boundingRect(cnt)cv2.rectangle(result,(x,y),(xw,yh),(0,255,0),2)cv2.putText(result,fRed Area:{area:.0f}px,(x,y-10),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),2)# 6. 显示结果cv2.imshow(原图,img)cv2.imshow(红色掩码,mask)cv2.imshow(检测结果,result)cv2.waitKey(0)cv2.destroyAllWindows()returnlen([cforcincontoursifcv2.contourArea(c)500])# 调用countdetect_red_region(example.jpg)print(f共检测到{count}个红色区域)常用速查表颜色转换cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 彩色 → 灰度cv2.cvtColor(img,cv2.COLOR_BGR2RGB)# BGR → RGBcv2.cvtColor(img,cv2.COLOR_BGR2HSV)# BGR → HSVcv2.cvtColor(img,cv2.COLOR_BGR2LAB)# BGR → LAB几何变换cv2.resize(img,(w,h))# 缩放cv2.flip(img,1)# 翻转cv2.warpAffine(img,M,(w,h))# 仿射变换cv2.warpPerspective(img,M,(w,h))# 透视变换滤波cv2.GaussianBlur(img,(5,5),0)# 高斯模糊cv2.medianBlur(img,5)# 中值模糊cv2.Canny(gray,50,150)# 边缘检测cv2.filter2D(img,-1,kernel)# 自定义卷积形态学操作cv2.erode(img,kernel)# 腐蚀cv2.dilate(img,kernel)# 膨胀cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)# 开运算cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)# 闭运算常见踩坑汇总问题原因解决方法图像颜色异常蓝红互换OpenCV 使用 BGRmatplotlib 使用 RGB显示前转换cv2.cvtColor(img, cv2.COLOR_BGR2RGB)imread返回None文件路径错误或文件不存在检查路径避免中文路径用os.path.exists()验证旋转后图像被裁剪warpAffine输出尺寸不够计算旋转后的新尺寸并传入轮廓检测结果异常输入图像不是二值图先进行阈值处理再检测轮廓imshow窗口一闪而过没有waitKey加上cv2.waitKey(0)小结本文覆盖了 OpenCV 图像操作的 10 个核心知识点读取、显示、保存——三板斧基本属性——shape、dtype、像素访问颜色空间转换——BGR/RGB/HSV/灰度✂️缩放与裁剪——resize、ROI翻转与旋转——flip、warpAffine✏️绘图与标注——line、rectangle、putText️滤波——模糊与锐化边缘检测——Canny、Sobel阈值与轮廓——threshold、findContours️综合实战——颜色区域检测掌握这些基础操作后你就可以进一步探索人脸检测、目标识别、OCR 文字识别等更高级的计算机视觉应用了。延伸阅读OpenCV 官方文档OpenCV-Python Tutorialsnumpy 官方文档本文示例基于 OpenCV 4.x Python 3.8最后更新2026 年 3 月