【计算机视觉入门】—— OpenCV基础 _02

【计算机视觉入门】—— OpenCV基础 _02 文章目录前言一、图像运算1.1 图像直接相加 1.2 cv2.add () 饱和加法1.3 cv2.addWeighted 图像加权融合二、图像边界填充 copyMakeBorder三、图像阈值分割 threshold四、图像平滑处理图像去噪4.1 椒盐噪声4.2 均值滤波 cv2.blur4.3 方框滤波 cv2.boxFilter4.4 高斯滤波 cv2.GaussianBlur4.5 中值滤波 cv2.medianBlur4.6 各平滑处理效果总结前言上一篇我们学习了 OpenCV 图像读取、显示、保存、通道拆分合并等基础操作本篇继续讲解 OpenCV 图像预处理核心内容包含图像算术运算、边界填充、阈值分割、图像平滑滤波四大模块。文中附带完整可直接运行的代码原理通俗易懂适合零基础入门学习。一、图像运算在 OpenCV 中图像本质上是一个由像素组成的矩阵。例如一张彩色图片height × width × channel其中height图片高度width图片宽度channel颜色通道对于 BGR 彩色图像channel 3每个像素由0 ~ 255范围内的数值表示。因此图像之间的加减乘除本质上就是矩阵运算。1.1 图像直接相加运算规则底层使用的是 NumPy 的模运算超过 255 时会发生溢出回绕。两个像素值相加后若数值≤255结果为像素和若数值255结果对 256 取模。importcv2 imgcv2.imread(01.jpg)resultimg10#作用将图片每个像素值增加 10cv2.imshow(origin,img)cv2.imshow(add,result)cv2.waitKey(0)cv2.destroyAllWindows()图像效果图片整体变亮。1.2cv2.add ()饱和加法运算规则像素相加后数值超过 255 时直接截断最大值 255不会出现像素值循环归零是图片融合场景的标准方案。img1cv2.imread(01.jpg)img2cv2.imread(02.jpg)# 将两张图片设置成相同大小img2cv2.resize(img2,(400,400))img1cv2.resize(img1,(400,400))resultcv2.add(img1,img2)cv2.imshow(add,result)cv2.waitKey(0)1.3cv2.addWeighted图像加权融合公式dst img1 × alpha img2 × beta gamma参数说明alpha第一张图像权重beta第二张图像权重gamma亮度调整值正数提亮画面负数压暗画面# 两张图权重各0.5整体亮度额外10ccv2.addWeighted(img1,0.5,img2,0.5,10)cv2.imshow(img_addWeighted,c)cv2.waitKey(0)cv2.destroyAllWindows()二、图像边界填充 copyMakeBordercv2.copyMakeBorder()用于给图像上下左右扩充边框卷积运算前填充边界可以避免卷积后图像尺寸缩小是图像处理常用操作。函数参数:cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)src输入原始图像top /bottom/left /right上下左右需要填充的像素宽度borderType填充模式共 5 种value仅纯色填充模式生效传入 BGR 颜色元组5 种填充模式填充模式效果BORDER_CONSTANT纯色常量填充自定义边框颜色BORDER_REFLECT镜像反射图像边缘像素参与重复反射BORDER_REFLECT_101标准镜像反射去除边缘重复BORDER_REPLICATE拉伸复制图像最外侧像素填充边框BORDER_WRAP循环平铺图像另一侧像素作为边框示例代码importcv2 acv2.imread(01.jpg)# 四边统一填充50像素top,bottom,left,right50,50,50,50# 1.纯色边框填充constantcv2.copyMakeBorder(a,top,bottom,left,right,cv2.BORDER_CONSTANT,value(229,25,80))# 2.镜像反射填充reflectcv2.copyMakeBorder(a,top,bottom,left,right,cv2.BORDER_REFLECT)# 3.标准镜像填充reflect101cv2.copyMakeBorder(a,top,bottom,left,right,cv2.BORDER_REFLECT_101)# 4.边缘复制填充replicatecv2.copyMakeBorder(a,top,bottom,left,right,cv2.BORDER_REPLICATE)# 5.循环平铺填充wrapcv2.copyMakeBorder(a,top,bottom,left,right,cv2.BORDER_WRAP)cv2.imshow(原图,a)cv2.imshow(CONSTANT纯色填充,constant)cv2.imshow(REFLECT镜像,reflect)cv2.imshow(REFLECT_101标准镜像,reflect101)cv2.imshow(REPLICATE边缘复制,replicate)cv2.imshow(WRAP循环平铺,wrap)cv2.waitKey(0)cv2.destroyAllWindows()三、图像阈值分割 threshold阈值分割用于区分图像前景与背景剔除高于或低于指定灰度值的像素。核心函数retval, dst cv2.threshold(src, thresh, maxval, type)参数详解:src输入图像推荐使用灰度单通道图thresh自定义分割阈值范围 0~255maxval二值化最大值仅 BINARY 系列模式生效type阈值分割类型共 5 种retval返回的阈值dst阈值分割结果图像与原始图像具有相同的大小和类型阈值规则对照表阈值类型像素 阈值 thresh像素 ≤ 阈值 threshTHRESH_BINARY赋值 maxval (255 纯白)赋值 0 (纯黑)THRESH_BINARY_INV赋值 0 (纯黑)赋值 maxval (255 纯白)THRESH_TRUNC赋值阈值 thresh保留原始灰度值THRESH_TOZERO保留原始灰度值赋值 0 (纯黑)THRESH_TOZERO_INV赋值 0 (纯黑)保留原始灰度值示例代码importcv2# 参数0代表以灰度模式读取图片imagecv2.imread(01.jpg,0)# 设置阈值175最大值255ret,binarycv2.threshold(image,175,255,cv2.THRESH_BINARY)ret1,binaryinvcv2.threshold(image,175,255,cv2.THRESH_BINARY_INV)ret2,trunccv2.threshold(image,175,255,cv2.THRESH_TRUNC)ret3,tozerocv2.threshold(image,175,255,cv2.THRESH_TOZERO)ret4,tozeroinvcv2.threshold(image,175,255,cv2.THRESH_TOZERO_INV)cv2.imshow(灰度原图,image)cv2.imshow(BINARY正向二值化,binary)cv2.imshow(BINARY_INV反向二值化,binaryinv)cv2.imshow(TRUNC阈值截断,trunc)cv2.imshow(TOZERO低于阈值置黑,tozero)cv2.imshow(TOZERO_INV高于阈值置黑,tozeroinv)cv2.waitKey(0)cv2.destroyAllWindows()四、图像平滑处理图像去噪图像拍摄、传输过程会产生噪点滤波操作可以平滑画面、消除噪点。下面模拟椒盐噪声并演示四种常用滤波算法。4.1 椒盐噪声椒盐噪声由随机黑白噪点组成模拟摄像头干扰、图像传输损坏产生的画面瑕疵。importcv2importnumpyasnpdefadd_peppersalt_noise(image,n10000):resultimage.copy()h,wimage.shape[:2]# 随机生成n个噪点foriinrange(n):xnp.random.randint(0,h)ynp.random.randint(0,w)# 50%概率黑点50%概率白点ifnp.random.randint(0,2)0:result[x,y]0else:result[x,y]255returnresult# 加载原图并添加噪声imagecv2.imread(01.jpg)noise_imgadd_peppersalt_noise(image)cv2.imshow(原图,image)cv2.imshow(椒盐噪声图,noise_img)cv2.waitKey(0)4.2 均值滤波 cv2.blur取卷积核范围内所有像素平均值替换中心像素实现基础平滑卷积核尺寸越大画面模糊程度越高。# 3×3小卷积核轻微平滑blur_3cv2.blur(noise_img,(3,3))# 63×63超大卷积核画面严重模糊blur_63cv2.blur(noise_img,(63,63))cv2.imshow(均值滤波 3*3,blur_3)cv2.imshow(均值滤波 63*63,blur_63)cv2.waitKey(0)4.3 方框滤波 cv2.boxFilter均值滤波的底层实现核心控制参数normalizenormalizeTrue开启归一化效果和均值滤波完全一致normalizeFalse关闭归一化直接累加像素值容易出现画面泛白# 归一化方框滤波box_normalcv2.boxFilter(noise_img,-1,(3,3),normalizeTrue)# 不归一化方框滤波box_no_normalcv2.boxFilter(noise_img,-1,(3,3),normalizeFalse)cv2.imshow(方框滤波-归一化,box_normal)cv2.imshow(方框滤波-不归一化,box_no_normal)cv2.waitKey(0)参数 ddepth-1输出图像的数据类型、深度和原图保持一致4.4 高斯滤波 cv2.GaussianBlur按照高斯正态分布分配像素权重中心像素权重最高平滑噪点的同时最大程度保留物体边缘。# 3×3卷积核X方向标准差为1Y方向自动同步gausscv2.GaussianBlur(noise_img,(3,3),1)cv2.imshow(高斯滤波,gauss)cv2.waitKey(0)4.5 中值滤波 cv2.medianBlur取卷积核内所有像素灰度的中位数替换中心像素去除椒盐噪声效果最优适合文字、条码类图像降噪。处理椒盐噪声最优。mediancv2.medianBlur(noise_img,3)cv2.imshow(中值滤波,median)cv2.waitKey(0)cv2.destroyAllWindows()4.6 各平滑处理效果原始噪声图像均值滤波方框滤波高斯滤波中值滤波总结本文围绕 OpenCV 图像预处理四大核心方向展开图像运算理解了图像即矩阵后分别使用加法取模、cv2.add()饱和截断和cv2.addWeighted()加权融合三种方式实现图像叠加掌握图像融合与亮度调节技巧。边界填充通过cv2.copyMakeBorder()的 5 种填充模式理解镜像、复制、平铺和常量填充的差异为后续卷积操作保留边缘信息打下基础。阈值分割借助cv2.threshold()将灰度图二值化用对照表快速记忆 5 种阈值类型的处理逻辑轻松分离前景与背景。图像平滑先模拟椒盐噪声再分别用均值滤波、方框滤波、高斯滤波和中值滤波去噪对比效果后得出中值滤波对椒盐噪声抑制最优的结论。以上四种预处理技巧是 OpenCV 图像分析的基石建议读者将示例代码复制本地运行调整参数观察效果变化。