文章目录
一、简介
深度学习(Deep Learning)与OpenCV(Open Source Computer Vision Library)的结合为计算机视觉领域带来了强大的解决方案。OpenCV是一个开源的计算机视觉和机器学习软件库,它提供了大量的视觉处理算法,包括但不限于图像和视频处理、特征检测、对象识别等。
二、OpenCV运用
1. 图片扩充
python
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.图像阈值处理
python
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.添加椒盐噪声
python
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),并将其设置为黑色或白色。 - 添加噪声并显示结果:读取图像并显示原始图像,调用函数添加噪声,并显示结果图像。
三、总结
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等)来完成深度学习任务。