一、图像的运算
像素值加法(numpy 运算)
原理:基于 Numpy 数组的元素级运算,每个像素的 BGR 三个通道值分别参与运算
python
a = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
b = cv2.imread(r"C:\Users\LEGION\Desktop\iron.jpg")
c = a+10
cv2.imshow('yuan',a)
cv2.imshow('a+10',c)
cv2.waitKey(0)
c = a[50:200,50:250]+b[50:200,50:250]
cv2.imshow('a+b',c)
cv2.waitKey(0)
注释:c=a+10,表示给a图像的所有像素值+10
c = a[50:200,50:250]+b[50:200,50:250],表示参与运算的图像区域尺寸要完全相同
特点:属于模运算(溢出时取模),例如像素值250 + 10 = 260 → 260 % 256 = 4
运行结果:


图像加法(OpenCV 函数)
python
a = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
b = cv2.imread(r"C:\Users\LEGION\Desktop\iron.jpg")
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
c = cv2.add(a,b)#也可以使用使用
cv2.imshow('a add b',c)
cv2.waitKey(0)
cv2.destroyAllWindows()
注释:与a + b类似,但属于饱和运算(溢出时取最大值 255)
区别:
a + b:模运算(250 + 10 = 4)cv2.add(a, b):饱和运算(250 + 10 = 255)
运行结果:

加权图像融合
python
c =cv2.addWeighted(a, 0.5,b, 0.5,10)#10:图像的亮度值(常数),将添加到加权和上gamma:
cv2.imshow('addWeighted',c)
cv2.waitKey(0)
cv2.destroyAllWindows()
注释:
-
按权重融合两张图像,公式为:
result = α×img1 + β×img2 + γ -
参数:
-
a/b:输入图像(需尺寸和通道数相同) -
0.5/0.5:权重α和β(总和可不为 1,控制两张图像的占比) -
10:偏置项γ(对结果整体加一个常量,调整亮度)
-
运行结果:

二、图像的阈值处理
阈值处理的本质是像素灰度值的判断与重映射 :设定一个阈值 T,将图像中每个像素的灰度值与 T 比较,根据比较结果赋予像素新的灰度值。OpenCV 的cv2.threshold()函数是实现这一功能的核心接口,其基本语法如下:
python
ret, dst = cv2.threshold(src, thresh, maxval, type)
参数说明:
-
src:输入图像(必须是单通道灰度图) -
thresh:设定的阈值(本文以 175 为例) -
maxval:阈值处理的最大值(通常设为 255,即白色) -
type:阈值处理类型(核心参数,决定不同处理逻辑) -
ret:返回的阈值(手动设定时与输入阈值一致,自动阈值时为计算出的阈值) -
dst:处理后的输出图像
1. cv2.THRESH_BINARY(二进制阈值)
大于阈值的像素设为最大值(通常为 255,白色),小于设为0(黑色)
适用于文档识别、轮廓提取、简单物体分割;
偏白的变纯白,偏黑的变纯黑
2. cv2.THRESH_BINARY_INV(反二进制阈值)
与THRESH_BINARY完全相反,大于阈值的像素设为 0(黑色),小于等于阈值的设为最大值(255,白色)。
适用于背景分割、缺陷检测(突出暗部缺陷)
偏白的变纯黑,偏黑的变纯白
3. cv2.THRESH_TRUNC(截断阈值)
像素值大于阈值时,强制设为阈值本身;小于等于阈值时,保持原像素值不变
适用于降低图像亮度、抑制高光区域
白色变得一样灰蒙蒙,偏黑的不变
4.cv2.THRESH_TOZERO(阈值化为0)
像素值大于阈值时,保持原像素值;小于等于阈值时,设为 0(黑色)
适用于保留亮部细节,去除暗部噪声
偏白色不变,偏黑的就变纯黑
5.cv2.THRESH_TOZERO_INV(反阈值化为0)
与THRESH_TOZERO相反,像素值大于阈值时,设为 0(黑色);小于等于阈值时,保持原像素值
适用于保留暗部细节,去除亮部干扰
偏白色变纯黑,偏黑的不变
代码如下:
python
image=cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp",0)
ret,binary=cv2.threshold(image,175,255,cv2.THRESH_BINARY)
ret1,binaryinv=cv2.threshold(image,175,255,cv2.THRESH_BINARY_INV)
ret2, trunc = cv2.threshold(image,175,255, cv2.THRESH_TRUNC)
ret3, tozero = cv2.threshold(image,175,255,cv2.THRESH_TOZERO)
ret4, tozeroinv = cv2.threshold(image,175,255,cv2.THRESH_TOZERO_INV)
# 3. 依次显示处理结果
cv2.imshow('原始灰度图', image)
cv2.waitKey(0) # 按下任意键切换图像
cv2.imshow('THRESH_BINARY(二进制阈值)', binary)
cv2.waitKey(0)
cv2.imshow('THRESH_BINARY_INV(反二进制阈值)', binaryinv)
cv2.waitKey(0)
cv2.imshow('THRESH_TRUNC(截断阈值)', trunc)
cv2.waitKey(0)
cv2.imshow('THRESH_TOZERO(阈值化为0)', tozero)
cv2.waitKey(0)
cv2.imshow('THRESH_TOZERO_INV(反阈值化为0)', tozeroinv)
cv2.waitKey(0)
# 4. 释放资源(必做,避免内存泄漏)
cv2.destroyAllWindows()
运行结果:

三、图像的边界填充
首先导入 OpenCV 库并读取目标图像,通过copyMakeBorder函数实现填充,该函数的核心参数包括原图像、上下左右填充像素数、填充类型,以及常量填充时的颜色值:
python
cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value=None)
参数详细说明
src:输入图像(numpy.ndarray类型),可以是单通道(灰度图)或多通道(如 RGB/BGR 彩色图)。
top:整数,指定图像顶部需要添加的边框像素数量。
bottom:整数,指定图像底部需要添加的边框像素数量。
left:整数,指定图像左侧需要添加的边框像素数量。
right:整数,指定图像右侧需要添加的边框像素数量。
borderType:边框填充方式的枚举值,决定了边框像素如何生成。
OpenCV 支持以下边框填充方式类型:
1.cv2.BORDER_WRAP:外包装填充)
边框像素从图像的对侧 "缠绕" 而来(类似平铺效果)。
2.cv2.BORDER_REFLECT_101:对称填充
与REFLECT类似,但反射以边缘像素为轴,包含边缘像素。
3.cv2.BORDER_REFLECT:反射填充
边框像素是原图边缘的镜像反射,不包含边缘像素本身的重复。
4.cv2.BORDER_REPLICATE:复制填充
边框像素由原图最边缘的像素复制而来
5.cv2.BORDER_CONSTANT:常数填充
边框像素使用指定的单一颜色填充,需配合value参数设置颜色(BGR 格式,如(255,0,0)表示蓝色)。
value:可选参数,仅当borderType=cv2.BORDER_CONSTANT时有效,指定边框的颜色值:
彩色图:BGR 三通道值(如(0,255,0)表示绿色)。
灰度图:单值(如128表示灰色)
返回值:添加边框后的新图像(numpy.ndarray类型),尺寸为:
(src.shape[0] + top + bottom, src.shape[1] + left + right, src.shape[2])(彩色图)
或 (src.shape[0] + top + bottom, src.shape[1] + left + right)(灰度图)
代码如下:
python
import cv2
ys = cv2.imread(r"C:\Users\LEGION\Desktop\OIP-C.webp")
# ys=cv2.resize(ys,dsize=None,fx=0.5,fy=0.5) #图片缩放
# ys=cv2.resize(ys,(640,480))
top,bottom,left,right = 50,50,50,50
constant = cv2.copyMakeBorder(ys, top,bottom, left,right, borderType=cv2.BORDER_CONSTANT, value=(229,25,80))
reflect = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(ys,top,bottom, left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2. BORDER_WRAP)
cv2.imshow( 'yuantu', ys)
cv2.waitKey(0)
cv2.imshow( 'CONSTANT', constant)
cv2.waitKey(0)
cv2.imshow('REFLECT', reflect)
cv2.waitKey(0)
cv2.imshow( 'REFLECT_101', reflect101)
cv2.waitKey(0)
cv2.imshow( 'REPLICATE', replicate)
cv2.waitKey(0)
cv2.imshow('WRAP',wrap)
cv2.waitKey(0)
运行结果:
