摘要在计算机视觉项目中“垃圾进垃圾出”是永恒的真理。模型效果好不好往往取决于预处理做得细不细。今天我们不讲复杂的算法专门聊聊OpenCV中最基础也最重要的两个操作调整图像大小Resize和颜色空间转换BGR转灰度、HSV。掌握这些你的图像处理之路才算真正开始。关键词OpenCV图像预处理Resize颜色空间转换HSV灰度图1. 为什么要调整图像大小Resize很多初学者会问“为什么不能直接把原图丢进模型” 原因主要有两点统一输入尺寸深度学习模型如CNN通常要求输入的图片尺寸是固定的比如 224x224 或 640x640。提高效率原图可能高达 4K 分辨率直接处理非常消耗内存和计算资源。缩小图片可以显著提升处理速度。在OpenCV中我们使用cv2.resize()函数。代码案例指定尺寸与按比例缩放importcv2# 读取图片imgcv2.imread(test.jpg)# 方法1直接指定宽和高 (宽, 高)# 注意OpenCV中shape是(高, 宽)但resize参数是(宽, 高)这里很容易搞混resized_imgcv2.resize(img,(640,480))# 方法2按比例缩放 (fx, fy 表示缩放倍数)# 比如缩小为原来的一半resized_halfcv2.resize(img,(0,0),fx0.5,fy0.5)cv2.imshow(Original,img)cv2.imshow(Resized 640x480,resized_img)cv2.waitKey(0)避坑指南cv2.resize()的第二个参数dsize格式是(width, height)也就是(列, 行)这与 numpy 的shape(行, 列)是反的写代码时要特别小心。2. 颜色空间转换BGR 转 灰度图GRAYOpenCV 默认读取图片的格式是BGR蓝绿红而不是我们熟悉的 RGB。但在很多场景下我们不需要颜色信息只需要亮度信息比如做边缘检测、人脸检测时。为什么要转灰度计算量小从 3 个通道变成 1 个通道数据量直接减少 2/3。抗干扰去除了颜色的干扰更能凸显物体的轮廓和纹理。代码案例importcv2 imgcv2.imread(test.jpg)# BGR 转 灰度图gray_imgcv2.cvtColor(img,cv2.COLOR_BGR2GRAY)print(f原图形状:{img.shape})# 例如: (1080, 1920, 3)print(f灰度图形状:{gray_img.shape})# 例如: (1080, 1920)cv2.imshow(Gray,gray_img)cv2.waitKey(0)3. 颜色空间转换BGR 转 HSV如果说灰度图是“去色”那 HSV 就是为了“更好地识别颜色”。什么是 HSVH (Hue)色相代表颜色的种类红、绿、蓝等。S (Saturation)饱和度代表颜色的深浅/纯度。V (Value)明度代表颜色的明暗。为什么要转 HSV在 BGR 空间中光照变化会同时影响 R、G、B 三个值很难通过设定阈值来提取特定颜色。而在 HSV 空间中色相H是独立的受光照影响较小非常适合做颜色追踪比如追踪一个红色的小球。代码案例提取特定颜色importcv2importnumpyasnp imgcv2.imread(color_balls.jpg)# BGR 转 HSVhsvcv2.cvtColor(img,cv2.COLOR_BGR2HSV)# 定义红色的HSV范围 (红色在HSV色轮两端这里简化只写一部分)# 实际应用中需要根据具体颜色调整这些值lower_rednp.array([0,100,100])upper_rednp.array([10,255,255])# 创建掩膜Mask只保留红色区域maskcv2.inRange(hsv,lower_red,upper_red)# 将掩膜与原图进行“与”运算提取结果resultcv2.bitwise_and(img,img,maskmask)cv2.imshow(Original,img)cv2.imshow(Mask,mask)cv2.imshow(Result,result)cv2.waitKey(0)4. 总结图像预处理是计算机视觉的“地基”。Resize搞定输入尺寸注意(宽, 高)的参数顺序。BGR2GRAY去色减计算量适合看轮廓。BGR2HSV分离亮度与颜色是做颜色识别的神器。