Opencv计算机视觉--阈值处理&图像运算&图像平滑处理

注:本博客中存在的所以图片路径都是电脑中图片所在位置的路径,想要使用,要修改成自己图像的路径后再使用

1、图像打码

1)切片部分 a[0:80, 50:130]
  • 0:80:从第0行到第79行(共80行)

  • 50:130:从第50列到第129列(共80列)

  • 实际上没有写第三个维度(颜色通道),所以默认选择所有颜色通道

  • 这个切片的大小是 80行 × 80列 × 3个颜色通道

2)np.random.randint() 参数

np.random.randint(0, 256, (80, 80, 3))

三个参数分别是:

  • 0 :随机数的下限(包含)

  • 256 :随机数的上限(不包含),所以实际生成 0-255 的整数

  • (80, 80, 3) :输出数组的形状

    • 80:高度

    • 80:宽度

    • 3:颜色通道数(通常对应 RGB)

python 复制代码
import cv2
import numpy as np
# 对图片进行打码
a = cv2.imread(r'./true.png')
a[0:80,50:130] = np.random.randint(0,256,(80,80,3))# 矩阵赋值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、图片组合

复制代码
b[120:200,200:280] = a[0:80,100:180]

注:这里矩阵大小必须要统一,并且范围要比原图像尺寸更小

python 复制代码
import cv2
a = cv2.imread('true.png')
b = cv2.imread('ky.png')
b[120:200,200:280] = a[0:80,100:180]# 矩阵大小必须要统一
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、图像缩放 cv2.resize

1)a_new = cv2.resize(a,(400,300))

这是一个 OpenCV的图像缩放操作,用于改变图像的尺寸

(1) a
  • 输入图像:可以是NumPy数组或图像文件路径

  • 通常是一个三维数组(彩色图像)或二维数组(灰度图像)

(2)(400, 300)
  • 目标尺寸:(宽度, 高度)

  • 重要:OpenCV使用(宽度, 高度)顺序,而NumPy数组使用(高度, 宽度)顺序

  • 400:新图像的宽度(列数)

  • 300:新图像的高度(行数)

(3)返回值 a_new
  • 缩放后的新图像数组

  • 不改变原图像a,而是创建一个副本

2)a1_new = cv2.resize(a,dsize=None,fx=2,fy=2)

这是一个 OpenCV使用缩放因子的图像放大操作,它按比例放大图像而不是指定具体尺寸。

(1)dsize=None
  • 目标尺寸设为None:表示不直接指定具体宽度和高度

  • 这样OpenCV会使用 fxfy 参数来计算新尺寸

(2)fx=2
  • 水平方向(X轴)缩放因子 = 2

  • 新宽度 = 原宽度 × 2

  • 宽度变为原来的 2倍

(3) fy=2
  • 垂直方向(Y轴)缩放因子 = 2

  • 新高度 = 原高度 × 2

  • 高度变为原来的 2倍

(4)返回值 a1_new
  • 放大后的新图像

  • 保持原图的宽高比(因为是等比例缩放)

  • 创建的是副本,原图 a 不变

python 复制代码
import cv2
a = cv2.imread('true.png')
# b = cv2.imread('xiaomao.jpg')
a_new = cv2.resize(a,(400,300))
# b_new = cv2.resize(b,(400,300))
a1_new = cv2.resize(a,dsize=None,fx=2,fy=2)
cv2.imshow('a',a)
# cv2.imshow('b',b)
cv2.imshow('a_new',a_new)
# cv2.imshow('b_new',b_new)
cv2.imshow('a1_new',a1_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('true_1.png',a)
# cv2.imwrite('xiaomao_1.png',b)

4、图像运算

1)加号运算
复制代码
对于+号运算,当对图像a,图像b进行加法求和时,遵循以下规则:
当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
当某位置像素相加得到的数值大于255时,该位置数值將截断结果并将其减去256 例如:相加后是260,实际是260-256=4
python 复制代码
import cv2
a = cv2.imread('true_1.png')
b = cv2.imread('ky_1.png')
c = a+30
cv2.imshow('yuan',a)
cv2.imshow('a+30',c)
cv2.waitKey(0)

i = a[50:200,50:200]+b[50:200,50:200]
cv2.imshow('a+b',i)
cv2.waitKey(0)

可以看到修改后的图颜色发生了变化

2)cv2.add()运算
复制代码
对于cv2.add()运算,当对图像a,图像b进行加法求和时,遵循以下规则:
当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
当某位置像素相加得到的数值大于255时,該位置数值为255
python 复制代码
import cv2
a = cv2.imread('true_1.png')
b = cv2.imread('ky_1.png')
b = cv2.resize(b, (300,300))
a = cv2.resize(a, (300,300))
c = cv2.add(a,b)
cv2.imshow('a add b',c)
cv2.waitKey(0)
cv2.destroyAllWindows()
3)图像加权运算
复制代码
就是在计算两幅图像的像素值之和时,將每幅图像的权重考虑进来,可以用公式表示为dst=src1xa+srcxB+Y
python 复制代码
import cv2
a = cv2.imread('true_1.png')
b = cv2.imread('ky_1.png')
b = cv2.resize(b, (300,300))
a = cv2.resize(a, (300,300))
c = cv2.addWeighted(a, 0.5, b, 0.5, 10)#10是图像的亮度值
cv2.imshow('add',c)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、阈值处理

复制代码
阈值处理是指剔除图像内像素值高于一定值或低于一定值的像素点。使用的方法为:
retval,dst=cv2.threshold(src,thresh,maxval,type)
retval代表返回的阈值
dst代表阈值分割结果图像,与原始图像具有相同的大小和类型
src代表要进行阈值分割的图像,可以是多通道的,8位或32位浮点型数值
thresh代表要设定的阈值
maxval代表type参数位THRESH_BINARY或者THRESH_BINARY_INV类型I时,需要设定的最大值
type代表阈值分割的类型,具体内容如下表所示:
       选项                 像素值>thresh            其他情况
CV2.THRESH_BINARY          maxval                     0
CV2.THRESH_BINARY_INV         0                   maxval
CV2.THRESH_TRUNC           thresh                 当前灰度值
CV2.THRESH_TOZERO          当前灰度值                  0
CV2.THRESH_TOZERO_INV         0                   当前灰度值
1)阈值处理灰度图版
python 复制代码
import cv2
ayuan=cv2.imread('xiaomao.jpg',0)#将0删去,就变成彩色版
a = cv2.resize(ayuan,dsize=None,fx=0.3,fy=0.3)
ret,a1=cv2.threshold(a,175,255,cv2.THRESH_BINARY)
ret,a2=cv2.threshold(a,175,255,cv2.THRESH_BINARY_INV)
ret,a3=cv2.threshold(a,175,255,cv2.THRESH_TRUNC)
ret,a4=cv2.threshold(a,175,255,cv2.THRESH_TOZERO)
ret,a5=cv2.threshold(a,175,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('gray',a)#原灰度图
# cv2.waitKey(0)
cv2.imshow('binary',a1)#偏白的变纯白,偏黑的变纯黑
# cv2.waitKey(0)
cv2.imshow('binary_inv',a2)#偏白的变纯黑,偏黑的变纯白
# cv2.waitKey(0)
cv2.imshow('triangle',a3)#偏白的变成阈值所设的颜色,偏黑的不变
# cv2.waitKey(0)
cv2.imshow('tozero',a4)#偏白的不变,偏黑的变成纯黑
# cv2.waitKey(0)
cv2.imshow('tozero_inv',a5)#偏白的变纯黑,偏黑的不变
cv2.waitKey(0)
cv2.destroyAllWindows()
2)阈值处理彩色版一

将灰度图版代码中ayuan=cv2.imread('xiaomao.jpg',0)中的0删去即可,即

python 复制代码
import cv2
ayuan=cv2.imread('xiaomao.jpg')
a = cv2.resize(ayuan,dsize=None,fx=0.3,fy=0.3)
ret,a1=cv2.threshold(a,175,255,cv2.THRESH_BINARY)
ret,a2=cv2.threshold(a,175,255,cv2.THRESH_BINARY_INV)
ret,a3=cv2.threshold(a,175,255,cv2.THRESH_TRUNC)
ret,a4=cv2.threshold(a,175,255,cv2.THRESH_TOZERO)
ret,a5=cv2.threshold(a,175,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('gray',a)
# cv2.waitKey(0)
cv2.imshow('binary',a1)
# cv2.waitKey(0)
cv2.imshow('binary_inv',a2)
# cv2.waitKey(0)
cv2.imshow('triangle',a3)
# cv2.waitKey(0)
cv2.imshow('tozero',a4)
# cv2.waitKey(0)
cv2.imshow('tozero_inv',a5)
cv2.waitKey(0)
cv2.destroyAllWindows()

3)阈值处理彩色版2

就是将3个通道都进行阈值处理

python 复制代码
'''阈值处理、彩色版另一种方法'''
import cv2
# 读取彩色图片
ayuan = cv2.imread('xiaomao.jpg')
a = cv2.resize(ayuan, dsize=None, fx=0.3, fy=0.3)
cv2.imshow('yuan',a)
# 分别对B、G、R三个通道应用阈值
b, g, r = cv2.split(a)
ret, b1 = cv2.threshold(b, 175, 255, cv2.THRESH_BINARY)
ret, g1 = cv2.threshold(g, 175, 255, cv2.THRESH_BINARY)
ret, r1 = cv2.threshold(r, 175, 255, cv2.THRESH_BINARY)

ret, b2 = cv2.threshold(b, 175, 255, cv2.THRESH_BINARY_INV)
ret, g2 = cv2.threshold(g, 175, 255, cv2.THRESH_BINARY_INV)
ret, r2 = cv2.threshold(r, 175, 255, cv2.THRESH_BINARY_INV)

ret, b3 = cv2.threshold(b, 175, 255, cv2.THRESH_TRUNC)
ret, g3 = cv2.threshold(g, 175, 255, cv2.THRESH_TRUNC)
ret, r3 = cv2.threshold(r, 175, 255, cv2.THRESH_TRUNC)

ret, b4 = cv2.threshold(b, 175, 255, cv2.THRESH_TOZERO)
ret, g4 = cv2.threshold(g, 175, 255, cv2.THRESH_TOZERO)
ret, r4 = cv2.threshold(r, 175, 255, cv2.THRESH_TOZERO)

ret, b5 = cv2.threshold(b, 175, 255, cv2.THRESH_TOZERO_INV)
ret, g5 = cv2.threshold(g, 175, 255, cv2.THRESH_TOZERO_INV)
ret, r5 = cv2.threshold(r, 175, 255, cv2.THRESH_TOZERO_INV)
# 合并通道
a1_color = cv2.merge([b1, g1, r1])
cv2.imshow('a1',a1_color)

a2_color = cv2.merge([b2, g2, r2])
cv2.imshow('a2',a2_color)

a3_color = cv2.merge([b3, g3, r3])
cv2.imshow('a3',a3_color)

a4_color = cv2.merge([b4, g4, r4])
cv2.imshow('a4',a4_color)

a5_color = cv2.merge([b5, g5, r5])
cv2.imshow('a5',a5_color)

cv2.waitKey(0)
cv2.destroyAllWindows()

6、图像平滑处理

复制代码
图像平滑(smoothing)也称为"模糊处理"(bluring)
通过消除图像中的噪声或细节来使图像看起来更为模糊,从而实现平滑效果
可以用来压制、弱化、消除图像中的细节、突变和噪声。
下面是常用的一些滤波器
  均值滤波(邻域平均滤波)->blUr函数
  方框滤波->boxFilter函数
  高斯滤波->GaussianBlur函数
  中值滤波->medianBlur函数
dst=cv2.blur(src, ksize,anchor,borderType)
dst是返回值
src是需要处理的图像
kszie是滤波核(卷积核)的大小
anchor是锚点,默认值是(-1,-1)一般无需更改
borderType是边界样式,一般无需更改
一般情况下,使用dst=cv2.blur(src,ksize)即可
python 复制代码
import cv2
import numpy as np

# 定义添加椒盐噪声的函数
def Noise(a, n=10000):
    b = a.copy()  # 创建图像的副本,避免修改原图
    h, w = a.shape[:2]  # 获取图片的高和宽,shape返回(高度, 宽度, 通道数)
    
    for i in range(n):  # 循环n次,添加n个噪声点
        x = np.random.randint(0, h)  # 随机生成行坐标(0到h-1之间)
        y = np.random.randint(0, w)  # 随机生成列坐标(0到w-1之间)
        
        if np.random.randint(0, 2) == 0:  # 随机生成0或1,50%概率
            b[x, y] = 0  # 设置为黑色像素(椒噪声)
        else:
            b[x, y] = 255  # 设置为白色像素(盐噪声)
    return b  # 返回添加噪声后的图像

# 读取原始图像
ayuan = cv2.imread('peopleone.jpg')  # 从文件读取图像,注意确保文件路径正确

# 将图像缩小到原图的40%(等比例缩放)
a = cv2.resize(ayuan, dsize=None, fx=0.4, fy=0.4)

# 显示原始缩放后的图像
cv2.imshow('yuan', a)  # 在名为'yuan'的窗口中显示图像a

# 添加椒盐噪声
noise = Noise(a)  # 调用Noise函数,添加10000个噪声点
cv2.imshow('noise', noise)  # 显示添加噪声后的图像

# 使用均值滤波(方框滤波的特殊形式)
blur1 = cv2.blur(noise, (3, 3))  # 3×3均值滤波,核大小为3×3
cv2.imshow('blur1', blur1)  # 显示滤波结果

blur2 = cv2.blur(noise, (7, 7))  # 7×7均值滤波,核更大,平滑效果更强
cv2.imshow('blur2', blur2)  # 显示滤波结果

cv2.waitKey(0)  # 等待按键,0表示无限等待
# cv2.destroyAllWindows()  # 注释掉了,所以窗口不会关闭

# 使用方框滤波
box_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True)  # 归一化的3×3方框滤波
# -1: 输出图像深度与输入相同
# normalize=True: 进行归一化,等价于均值滤波
cv2.imshow('box_1', box_1)  # 显示滤波结果

box_2 = cv2.boxFilter(noise, -1, (3, 3), normalize=False)  # 非归一化的3×3方框滤波
# normalize=False: 不进行归一化,直接求和,可能产生过亮像素
cv2.imshow('box_2', box_2)  # 显示滤波结果

# 使用高斯滤波
gau = cv2.GaussianBlur(noise, (3, 3), 1)  # 3×3高斯滤波,标准差为1
# 高斯滤波根据距离中心点的远近给予不同权重,中心权重最大
cv2.imshow('gau', gau)  # 显示滤波结果

# 使用中值滤波
med = cv2.medianBlur(noise, 3)  # 3×3中值滤波,取邻域内像素值的中位数
# 对椒盐噪声特别有效,能更好地保留边缘信息
cv2.imshow('med', med)  # 显示滤波结果

cv2.waitKey(0)  # 再次等待按键
cv2.destroyAllWindows()  # 关闭所有OpenCV创建的窗口
相关推荐
shayudiandian12 小时前
AI生成内容(AIGC)在游戏与影视行业的落地案例
人工智能·游戏·aigc
木头左12 小时前
深度学习驱动的指数期权定价与波动率建模技术实现
人工智能·深度学习
AI科技星12 小时前
统一场论变化的引力场产生电磁场推导与物理诠释
服务器·人工智能·科技·线性代数·算法·重构·生活
不会用AI的老炮12 小时前
【AI coding 智能体设计系列-05】上下文治理:清空压缩摘要与预算控制
人工智能·ai·ai编程
速易达网络12 小时前
AI工具全景:从概念到产业的深度变革
人工智能
点云SLAM12 小时前
Algebraic 英文单词学习
人工智能·英文单词学习·雅思备考·代数形式的·代数的 / 与代数相关的·algebraic
狮子座明仔12 小时前
DISCOG:知识图谱+LLM双引擎驱动的法律电子取证系统
人工智能·深度学习·知识图谱
Ydwlcloud12 小时前
2026年1月云服务器优惠活动全解析:聪明选云的新策略
大数据·服务器·人工智能·云计算
AI Echoes12 小时前
LangChain 语义文档分割器与其他文档分割器的使用
大数据·人工智能·python·langchain·agent
lbb 小魔仙12 小时前
Linux 安全攻防 2025:从 SELinux 配置到漏洞应急响应全流程
linux·python·安全