openCV实战-系列教程2:阈值与平滑处理(图像阈值/图像平滑处理/高斯/中值滤波)、源码解读

1、图像阈值

t图像阈值函数,就是需要判断一下像素值大于一个数应该怎么处理,小于一个数应该怎么处理

python 复制代码
ret, dst = cv2.threshold(src, thresh, maxval, type)

参数解析:

  • src: 原始输入图,只能 输入通道图像,通常来说为灰度图
  • dst: 输出图
  • thresh: 指定的阈值
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
  • cv2.THRESH_BINARY:超过阈值部分取maxval(最大值),否则取0
    • 如果阈值取150,超过150就会都变成255,否则变为0
  • cv2.THRESH_BINARY_INV:THRESH_BINARY的反转
  • cv2.THRESH_TRUNC:大于阈值部分设为阈值,否则不变
  • cv2.THRESH_TOZERO:大于阈值部分不改变,否则设为0
  • cv2.THRESH_TOZERO_INV:THRESH_TOZERO的反转
python 复制代码
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB

# 读取图像为灰度图
img=cv2.imread('cat.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 五种参数都设置一遍
ret, thresh1 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
_, thresh2 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY_INV)
_, thresh3 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TRUNC)
_, thresh4 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO)
_, thresh5 = cv2.threshold(img_gray, 127, 255, cv2.THRESH_TOZERO_INV)

# 存到一个变量中
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]

# 放到一起画出来
for i in range(6):
    plt.subplot(2, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

这里(ret,thresh)我们基本上只需要第二个参数就行了,输出图:

  • 第一张是原始图像
  • 第二张,所有大于127的区域全部变成了白色
  • 第三张,将第二张进行了翻转
  • 第四张,所有大于127的全部等于127
  • 第五张,小于127全部为0 ,大于127的不变
  • 第六张,第五张的反转

2、图像平滑

图像平滑处理就是对图像进行各种滤波操作,这个和卷积操作有一些相似

首先读取打印原始图像:

python 复制代码
import cv2  # opencv读取的格式是BGR
import matplotlib.pyplot as plt  # Matplotlib是RGB
img = cv2.imread('lenaNoise.png')
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印的图像:

可以看到原始图像有很多白色斑点的噪音,接下来用几种不同滤波操作过滤这个噪音点

2.1 均值滤波

实际上是一个简单的平均卷积操作,如下图是一个图像的像素点的矩阵:

比如圈住的这个部分,是一个3*3的区域,对这3*3的9个像素值求出一个均值,然后将中间的204替换成这个均值,那么就完成了204的滤波操作,其他的像素点也是进行这样的操作。当然也可以是一个5*5的区域,只能是奇数。

实现这个操作很简单:

python 复制代码
# 均值滤波
# 简单的平均卷积操作
blur = cv2.blur(img, (3, 3))
cv2.imshow('blur', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()

打印结果:

可以发现白点被淡化了一些,但是还是存在

2.2 方框滤波

基本上和均值滤波一样:

python 复制代码
# 方框滤波
# 基本和均值一样,可以选择归一化
box = cv2.boxFilter(img,-1,(3,3), normalize=True)  

cv2.imshow('box', box)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里可以选择

相关推荐
欲儿7 小时前
magicCamera—魔术师的 AR 卡牌应用
opencv·安卓·魔术师
羊羊小栈15 小时前
基于「YOLO目标检测 + 多模态AI分析」的篮球动作规范智能检测分析预警系统
人工智能·yolo·目标检测·计算机视觉·毕业设计·大作业
Hua-Jay19 小时前
OpenCV联合C++/Qt 学习笔记(二十)----Harri角点检测、Shi-Tomas角点检测及亚像素级别角点位置优化
c++·笔记·qt·opencv·学习·计算机视觉
Hua-Jay20 小时前
OpenCV联合C++/Qt 学习笔记(十九)----图像分割
c++·笔记·qt·opencv·学习
armwind20 小时前
数字图像处理-2-二值化,投影,灰度变换,直方图
计算机视觉
埃科光电20 小时前
应用分享丨16K光口彩色TDI线阵相机筑牢高端PCB质量防线
图像处理·计算机视觉·相机·pcb工艺
陈嘿萌20 小时前
学术速递|2026年4月 arXiv 图像融合论文汇总(04.01–04.30)10 篇最新成果
人工智能·机器学习·计算机视觉·图像融合·arxiv
鹿角片ljp20 小时前
实时目标检测部署复盘:模型没问题,现场出现框延迟和漏检
人工智能·目标检测·计算机视觉
No8g攻城狮21 小时前
【VR应用】部署企业级 VR 应用,主流方案有哪些及每个方案的优点和缺点
图像处理·计算机视觉·vr
AI人工智能+21 小时前
一种基于深度学习的表格识别技术,通过融合计算机视觉、图神经网络和Transformer等算法,能精准解析复杂表格结构
深度学习·计算机视觉·ocr·表格识别