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创建的窗口
相关推荐
CIO_Alliance3 分钟前
AI+iPaaS解决方案深度整合:让跨系统业务流程自动化一步到位
人工智能·ipaas·系统集成·ai+ipaas·企业cio联盟·企业级ai化转型
苏州IT威翰德4 分钟前
算力资产“续命”专家:苏州威翰德科技赋能NVIDIA高端AI芯片芯片级维修
大数据·人工智能
天上路人17 分钟前
A59P双波束语音模块:神经网络降噪在远场拾音中的工程实现分析
人工智能·深度学习·神经网络·ai降噪·ai语音·麦克风·回音消除
冬奇Lab25 分钟前
AI 评测系列(03):LLM-as-Judge——让 LLM 评价 LLM 的正确姿势
人工智能·llm
Miao1213135 分钟前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践
大数据·数据库·人工智能
冬奇Lab38 分钟前
每日一个开源项目(第164篇):毕昇(BISHENG)- 面向企业的开源 LLM DevOps 平台
人工智能·开源·agent
SeaTunnel39 分钟前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记1 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
CCPC不拿奖不改名1 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github
声讯电子1 小时前
录音笔AI降噪方案:从录得到到听得清的听觉革命
人工智能·语音识别