计算机视觉——Opencv(基础操作二)

一、图像的运算

像素值加法(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)

运行结果:

相关推荐
Piar1231sdafa2 小时前
野猪目标检测与识别_基于YOLO11-Attention模型的改进实现
人工智能·目标检测·计算机视觉
一路向阳~负责的男人2 小时前
PyTorch / CUDA 是什么?它们的关系?
人工智能·pytorch·python
2501_941333102 小时前
乒乓球比赛场景目标检测与行为分析研究
人工智能·目标检测·计算机视觉
岑梓铭2 小时前
YOLO深度学习(计算机视觉)一很有用!!(进一步加快训练速度的操作)
人工智能·深度学习·神经网络·yolo·计算机视觉
2401_841495642 小时前
深度卷积生成对抗网络(DCGAN)
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·深度卷积生成对抗网络
byzh_rc2 小时前
[深度学习网络从入门到入土] 反向传播backprop
网络·人工智能·深度学习
BOLD-Rainbow2 小时前
DCRNN (Diffusion Convolutional Recurrent Neural Network)
人工智能·深度学习·机器学习
zhangfeng11332 小时前
如何用小内存电脑训练大数据的bpe,16g内存训练200g数据集默认是一次性读入内存训练
大数据·人工智能
Candice Can2 小时前
【机器学习】吴恩达机器学习Lecture1
人工智能·机器学习·吴恩达机器学习