一、简介
深度学习(Deep Learning)与OpenCV(Open Source Computer Vision Library)的结合为计算机视觉领域带来了强大的解决方案。OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了大量的视觉处理算法,包括但不限于图像和视频处理、特征检测、对象识别等。
二、OpenCV运用
1. 图片扩充
import cv2
a = cv2.imread('2.png')
top, bottom, left, right = 50, 50, 50, 50
constant = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(0, 0, 0))
reflect = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(a, top, bottom, left, right, borderType=cv2.BORDER_WRAP)
cv2.imshow('a', a)
cv2.waitKey(0)
cv2.imshow('constant', constant)
cv2.waitKey(0)
cv2.imshow('reflect', reflect)
cv2.waitKey(0)
cv2.imshow('reflect101', reflect101)
cv2.waitKey(0)
cv2.imshow('replicate', replicate)
cv2.waitKey(0)
cv2.imshow('wrap', wrap)
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.BORDER_CONSTANT(常量边框):
- 使用指定的颜色值填充边框。在您的代码中,颜色被设置为黑色((0, 0, 0))。
- 使用场景:当你需要在图像周围添加纯色边框时,比如为了美观或标记。
- cv2.BORDER_REFLECT(反射边框):
- 边框像素是图像边缘像素的镜像反射,但不包括边缘本身。
- 使用场景:当你需要图像边缘的平滑过渡,但不想引入新的颜色或内容时。
- cv2.BORDER_REFLECT101(反射101边框):
- 与BORDER_REFLECT类似,但包括边缘像素的镜像。
- 使用场景:与BORDER_REFLECT相似,但如果你需要确保边缘像素也被考虑在内。
- cv2.BORDER_REPLICATE(复制边框):
- 边框像素是图像边缘像素的复制。
- 使用场景:当你需要图像边缘的精确复制时,比如在某些图像处理算法中,边缘像素的值对结果有重要影响。
- cv2.BORDER_WRAP(包裹边框):
- 边框像素是从图像的另一侧“包裹”过来的。例如,左边缘的边框像素是从图像的右边缘取的。
- 使用场景:当你处理的是具有周期性或循环性质的图像时,比如全景图像或某些类型的纹理图像。
2.图像阈值处理
import cv2
image = cv2.imread('3.png', cv2.IMREAD_GRAYSCALE)
ret, binary = cv2.threshold(image, 180, 255, cv2.THRESH_BINARY) # maxval:0
ret1, binaryinv = cv2.threshold(image, 180, 255, cv2.THRESH_BINARY_INV) # 0:maxval
ret2, trunc = cv2.threshold(image, 190, 255, cv2.THRESH_TRUNC) # thresh:当前灰度值
ret3, tozero = cv2.threshold(image, 100, 255, cv2.THRESH_TOZERO) # 当前灰度值:0
ret4, tozeroinv = cv2.threshold(image, 190, 255, cv2.THRESH_TOZERO_INV) # 0:当前灰度值
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.imshow('binary', binary)
cv2.waitKey(0)
cv2.imshow('binaryniv', binaryinv)
cv2.waitKey(0)
cv2.imshow('trunc', trunc)
cv2.waitKey(0)
cv2.imshow('tozero', tozero)
cv2.waitKey(0)
cv2.imshow('tozeroinv', tozeroinv)
cv2.waitKey(0)
cv2.destroyAllWindows()
- cv2.THRESH_BINARY:这是最基本的阈值类型。如果像素值大于阈值,则将其设置为maxval(在您的例子中为255),否则将其设置为0。
- cv2.THRESH_BINARY_INV:这与THRESH_BINARY相反。如果像素值小于阈值,则将其设置为maxval,否则设置为0。
- cv2.THRESH_TRUNC:如果像素值大于阈值,则将其设置为阈值本身,否则保持不变。这通常用于去除图像中的亮点。
- cv2.THRESH_TOZERO:如果像素值小于阈值,则将其设置为0,否则保持不变。这有助于从图像中去除暗区域。
- cv2.THRESH_TOZERO_INV:这与THRESH_TOZERO相反。如果像素值大于阈值,则保持不变,否则设置为0。这有助于从图像中去除亮区域。
3.添加椒盐噪声
import cv2
import numpy as np
def add_peppersalt_noise(image, n=10000):
result = image.copy()
h, w = image.shape[:2]
for i in range(n):
x = np.random.randint(1, h)
y = np.random.randint(1, w)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x, y] = 255
return result
image = cv2.imread('3.png')
cv2.imshow('a', image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise', noise)
cv2.waitKey(0)
- 定义函数:定义函数,这个函数接收一个图像和一个可选的整数 n(默认为
10000)作为参数。它的目的是向图像中添加椒盐噪声,即随机地将图像中的像素点设置为黑色(0)或白色(255)。 - 处理图像:创建一个图像的副本,以避免修改原始图像。然后,获取图像的高度 h 和宽度 w,循环 n 次,每次循环都随机选择一个像素点 (x,
y),并将其设置为黑色或白色。 - 添加噪声并显示结果:读取图像并显示原始图像,调用函数添加噪声,并显示结果图像。
4.图像平滑
def add_peppersalt_noise(image, n=10000):
result = image.copy()
h, w = image.shape[:2]
for i in range(n):
x = np.random.randint(1, h)
y = np.random.randint(1, w)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x, y] = 255
return result
image = cv2.imread('3.png')
cv2.imshow('a', image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise', noise)
cv2.waitKey(0)
"""
均值滤波
"""
blur_1 = cv2.blur(noise, (3, 3))
cv2.imshow('blur_1', blur_1)
cv2.waitKey(0)
blur_2 = cv2.blur(noise, (5, 5))
cv2.imshow('blur_2', blur_2)
cv2.waitKey(0)
"""方框滤波"""
# normalize表示在滤波时是否进行归一化
boxFilter = cv2.boxFilter(noise, -1, (3, 3), normalize=True)
cv2.imshow('boxFilter', boxFilter)
cv2.waitKey(0)
boxFilter1 = cv2.boxFilter(noise, -1, (3, 3), normalize=False)
cv2.imshow('boxFilter1', boxFilter1)
cv2.waitKey(0)
# """高斯滤波"""
G = cv2.GaussianBlur(noise, (3, 3), 1) # 标准差为1,标准正态分布
cv2.imshow('G', G)
cv2.waitKey(0)
# """中值滤波"""
M = cv2.medianBlur(noise, 5)
cv2.imshow('M', M)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 均值滤波:均值滤波(也称为方框滤波,当normalize=True时)通过计算图像中每个像素周围邻域的平均值来替换该像素的值。这有助于减少图像中的随机噪声,但也可能导致图像变得模糊。
- 方框滤波:方框滤波与均值滤波非常相似,但提供了更多的灵活性,特别是通过normalize参数。normalize=True时,它等同于均值滤波;当normalize=False时,它将邻域内的像素值相加,但不进行归一化,这可能导致像素值超出正常范围。
- 高斯滤波:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。它通过对图像中的每个像素点及其邻域内的像素点进行加权平均,权重由高斯函数给出。
- 中值滤波:中值滤波是一种非线性滤波技术,常用于去除图像或信号中的噪声。它将每个像素点的值替换为该点邻域内所有像素点值的中位数。这种方法对于去除椒盐噪声特别有效。
三、总结
OpenCV作为一个开源的计算机视觉库,具有显著的优点和一定的缺点。以下是对其优缺点的详细分析:
- 优点
- 开源与免费:OpenCV是开源的,允许用户自由使用、修改和分发,且对非商业应用和商业应用都是免费的。这大大降低了使用成本,促进了计算机视觉技术的普及和发展。
- 跨平台性:OpenCV支持多个操作系统,包括Windows、Linux、Mac OS等,且可以在不同平台上使用相同的代码。这种跨平台性使得OpenCV的应用范围更加广泛,便于开发者在不同环境下进行开发和部署。
- 多功能性:OpenCV提供了丰富的图像处理和计算机视觉算法,包括图像增强、特征提取、目标检测、人脸识别等。这些功能能够满足各种视觉应用的需求,使得开发者能够轻松实现复杂的计算机视觉任务。
- 高效性能:OpenCV使用C/C++编写,具有高效的运行速度,可以处理实时视频流和大规模图像数据。这使得OpenCV在实时性要求较高的应用场景中表现出色。
- 可扩展性:OpenCV支持多种编程语言,包括C++、Python、Java等,也支持与其他库的集成。这种可扩展性使得OpenCV能够与其他技术栈无缝对接,方便进行开发和部署。
- 缺点
- 学习曲线陡峭:OpenCV的接口相对复杂,需要一定的学习成本。对于初学者来说,可能需要花费一些时间来理解和掌握其使用方法。此外,OpenCV的文档和示例虽然丰富,但也可能存在不够直观或难以理解的情况。
- 部分功能不完善:尽管OpenCV提供了很多功能,但对于一些特定的应用场景,可能还需要额外的算法或库来完成更复杂的任务。这可能需要开发者自行实现或寻找其他解决方案。
- 依赖性:OpenCV可能需要依赖于其他库和工具,例如NumPy、Matplotlib等。这增加了开发和部署的复杂性,需要开发者在项目中额外考虑这些依赖项的管理和配置。
- 深度学习支持相对较弱:虽然OpenCV提供了一些基本的机器学习算法,但在深度学习方面的支持相对较弱。对于需要深度学习功能的项目,可能需要借助其他框架(如TensorFlow、PyTorch等)来完成深度学习任务。