19 使用 OpenCV、scikit-image 和 Python 检测低对比度图像(Python)
如果您能够在捕获图像时控制环境,最重要的是能够控制照明,那么编写代码来处理图像就会越容易。
在受控照明条件下,您可以对参数进行硬编码,包括:
模糊量
边缘检测边界
阈值限制
等。
从本质上讲,受控条件允许您利用对环境的先验知识,然后编写处理该特定环境的代码,而不是尝试处理每个边缘情况或条件。
当然,控制您的环境和照明条件并不总是可行的......
…那你该怎么办呢?
您是否尝试编写一个超级复杂的图像处理管道来处理每个边缘情况?
井。。。您可以这样做 — 并且可能会浪费数周或数月的时间,但仍然可能无法捕获每个边缘情况。
或者,您可以改为检测何时向管道显示低质量图像,特别是低对比度图像。
如果检测到低对比度图像,您可以丢弃该图像或提醒用户在光线较好的条件下拍摄图像。
这样做将使您更容易开发图像处理管道(并减少在此过程中的麻烦)
17. OpenCV 直方图均衡化和自适应直方图均衡化 (CLAHE)(Python代码)
从本质上讲,直方图均衡的工作原理是:
计算图像像素强度的直方图
均匀分布和分布最频繁的像素值(即直方图中计数最大的像素值)
为累积分布函数 (CDF) 提供线性趋势
应用直方图均衡的结果是图像具有更高的全局对比度。
我们可以通过应用一种称为对比度受限自适应直方图均衡化 (CLAHE) 的算法来进一步改进直方图均衡化,从而获得更高质量的输出图像。
除了摄影师使用直方图均衡来校正曝光不足/曝光过度的图像外,使用最广泛的直方图均衡应用还可以在医疗领域找到。
您通常会看到对 X 射线扫描和 CT 扫描应用直方图均衡,以提高 X 射线照片的对比度。这样做有助于医生和放射科医生更好地解释扫描结果并做出准确的诊断。
15. 直方图与 OpenCV、scikit-image 和 Python 匹配(python代码)
如果您想自动匹配两张图像的对比度或颜色分布怎么办?
例如,假设我们有一个输入图像和一个参考图像。我们的目标是:
计算每张图像的直方图
获取参考图像直方图
使用参考直方图更新输入图像中的像素强度值,使其匹配
我们在本博客文章顶部的图中看到了结果。请注意输入图像是如何更新的,以匹配参考图像的颜色分布。
将图像处理管道应用于在不同照明条件下捕获的图像时,直方图匹配非常有用,从而创建图像的“标准化”表示,而不管它们在何种照明条件下捕获(当然,要对照明条件的变化量设定合理的预期)。
今天我们将详细讨论直方图匹配。下周,我将介绍如何使用直方图均衡进行颜色校正和颜色恒定性。
14. 使用 OpenCV 和 Python 进行自动色彩校正(python代码,包括数据集)
我们发现了如何执行直方图匹配。使用直方图匹配,我们可以获取一张图像的颜色分布并将其与另一张图像匹配。
颜色匹配的实际应用是通过颜色恒定性执行基本颜色校正。 颜色恒定的目标是正确感知物体的颜色,而不管光源、照明等的差异如何(可以想象,这说起来容易做起来难)。
CV从业者可以通过使用颜色校正卡来帮助获得颜色恒定性,如下所示:
使用颜色校正/颜色恒定卡,我们可以:
检测输入图像中的颜色校正卡
计算卡片的直方图,其中包含不同颜色、色调、阴影、黑色、白色和灰色的渐变颜色
将颜色卡中的直方图匹配应用于另一个图像,从而尝试实现颜色恒定性
13.OpenCV 连接组件标记和分析(python代码,包括数据集)
在本教程中,您将学习如何使用 OpenCV 执行连接组件标记和分析。具体来说,我们将重点介绍 OpenCV 最常用的连接组件标记功能cv2.connectedComponentsWithStats.
连通分量标记(也称为连通分量分析、blob 提取或区域标记)是图论的一种算法应用,用于确定二进制图像中“blob”状区域的连通性。
我们经常在使用等值线的相同情况下使用连通分量分析;但是,连接组件标记通常可以让我们对二进制映像中的 blob 进行更精细的筛选。
使用轮廓分析时,我们经常受到轮廓层次结构的限制(即,一个轮廓包含在另一个轮廓中)。通过连通组件分析,我们可以更轻松地分割和分析这些结构。
连通分量分析的一个很好的例子是计算二进制(即阈值)车牌图像的连通分量,并根据其属性(例如,宽度、高度、面积、密度等)过滤斑点。这正是我们今天要在这里做的事情。
12.使用 FGSM(快速梯度签名方法)进行对抗性攻击
在本教程中,您将学习如何使用快速梯度符号方法 (FGSM) 执行对抗性攻击。我们将使用 Keras 和 TensorFlow 实现 FGSM。
图像及其标签的数据集对于理解使用 FGSM 的对抗性攻击至关重要。它使我们能够看到这些攻击如何操纵模型的输入,从而导致错误的预测。
Roboflow 为计算机视觉管道的每个阶段提供免费工具,这些工具将简化您的工作流程并提高您的工作效率。
注册或登录您的 Roboflow 帐户以访问最先进的数据集库并彻底改变您的计算机视觉管道。
您可以先选择自己的数据集,也可以使用我们的 PyimageSearch 的各种有用数据集库。
将 40+ 格式中任何一种格式的数据引入 Roboflow,使用任何最先进的模型架构进行训练,跨多个平台(API、NVIDIA、浏览器、iOS 等)部署,并连接到应用程序或第三方工具。
之前,我们学习了如何实施两种形式的对抗性图像攻击:
非目标对抗性攻击,我们无法控制对抗图像的输出标签。
针对性对抗攻击,我们可以控制图像的输出标签。
今天,我们将介绍另一种称为快速梯度符号法 (FGSM) 的非靶向对抗性图像生成方法
11.使用 Keras 和 TensorFlow 防御对抗性图像(Python代码,包括数据集)
使用对抗性图像,我们可以欺骗卷积神经网络 (CNN) 做出错误的预测。虽然根据人眼的说法,对抗性图像可能看起来与原始图像相同,但它们包含小的扰动,导致我们的 CNN 做出非常错误的预测。
正如我在本教程中讨论的那样,将未防御的模型部署到野外会带来巨大的后果。
例如,假设有一个深度神经网络部署到自动驾驶汽车上。恶意用户可以生成对抗性图像,打印它们,然后将它们应用于道路、标志、立交桥等,这会导致模型认为有行人、汽车或障碍物,而实际上根本没有!结果可能是灾难性的,包括车祸、受伤和生命损失。
考虑到对抗性图像带来的风险,这就提出了一个问题:
我们能做什么来抵御这些攻击?
我们将在关于对抗性图像防御的两部分系列中回答这个问题:
使用 Keras 和 TensorFlow 防御对抗性图像攻击(今天的教程)
训练 CNN 时混合正常图像和对抗图像(下周指南)
对抗性形象辩护可不是开玩笑的。如果要将模型部署到现实世界中,请确保您已制定程序来抵御对抗性攻击。
通过遵循这些教程,您可以训练 CNN 做出正确的预测,即使它们看到的是对抗性图像
10.在训练 CNN 时混合正常图像和对抗性图像(python代码,包括数据集)
在本教程中,您将学习如何在训练过程中生成 (1) 正常图像和 (2) 对抗图像的图像批次。这样做可以提高模型泛化和防御对抗性攻击的能力。
上周,我们学习了一种防御对抗性攻击的简单方法。这种方法是一个简单的三步过程:
在原始训练集上训练 CNN
从测试集(或等效的维持集)生成对抗性示例
微调对抗性示例的 CNN
这种方法效果很好,但只需改变训练过程就可以大大改进。
我们可以改变批处理生成过程本身,而不是在一组对抗性示例上微调网络。
当我们训练神经网络时,我们会分批进行数据训练。每个批次都是训练数据的子集,通常以 2 的幂(8、16、32、64、128 等)的大小调整。对于每个批次,我们执行网络的正向传递,计算损失,执行反向传播,然后更新网络的权重。这基本上是任何神经网络的标准训练协议。
我们可以通过以下方式修改此标准训练程序以纳入对抗性示例:
初始化我们的神经网络
选择总共 N 个训练示例
使用该模型和 FGSM 等方法生成总共 N 个对抗示例
将两组合并,形成一个大小为 Nx2 的批次
在对抗样本和原始训练样本上训练模型
这种方法的好处是模型可以从自身学习。
每次批量更
9.OpenCV 模板匹配 (cv2.matchTemplate)(python代码,包括数据集)
在本教程中,您将学习如何使用 OpenCV 和cv2.match模板功能。
除了轮廓过滤和处理之外,模板匹配可以说是最简单的对象检测形式之一:
它易于实现,只需要 2-3 行代码
模板匹配在计算上是高效的
它不需要您执行阈值处理、边缘检测等来生成二进制图像(例如轮廓检测和处理)
使用基本扩展,模板匹配可以检测输入图像中相同/相似对象的多个实例(我们将在下周介绍)
当然,模板匹配并不完美。尽管有这些优点,但如果输入图像中存在变化因素,包括旋转、缩放、视角等的变化,模板匹配很快就会失败。
如果您的输入图像包含这些类型的变体,则不应使用模板匹配 — 使用专用的对象检测器,包括 HOG + Linear SVM、Faster R-CNN、SSD、YOLO 等。
但是,在你知道旋转、缩放和视角保持不变的情况下,模板匹配可以创造奇迹。
8.使用 OpenCV 进行多模板匹配(Python代码,包括数据集)
在本教程中,您将学习如何使用 OpenCV 执行多模板匹配。
资源7您了解了如何利用 OpenCV 和cv2.matchTemplate函数进行基本的模板匹配。这种方法的问题在于,它只能检测输入图像中的模板的一个实例—您无法执行多对象检测!
我们只能检测到一个物体,因为我们使用该cv2.minMaxLoc函数来查找具有最大归一化相关性得分的单个位置。
要执行多对象模板匹配,我们需要做的是:
cv2.matchTemplate像平常一样应用函数
找到所有(x, y)坐标中模板匹配结果矩阵大于预设阈值分数的位置
提取所有这些区域
对它们应用非最大值抑制
经过上述四个步骤,我们将能够检测输入图像中的多个模板。
7.OpenCV 使用 Haar 级联进行实时人脸检测(python代码,包括数据集)
首先,我建议 Angelos 研究 Movidius NCS 和 Google Coral USB Accelerator 等协处理器。这些设备可以实时运行计算量巨大的基于深度学习的面部检测器(包括 OpenCV 的深度学习面部检测器)。
尽管如此,我不确定这些协处理器是否适合 Angelos。它们可能成本过高,耗电量太大,等等。
我思考了一下 Angelos 的问题,然后回过头去查看档案,看看是否有可以帮助他的教程。
令我惊讶的是,我意识到我从来没有编写过关于使用 OpenCV 的 Haar 级联进行人脸检测的专门教程!
虽然我们可以通过深度学习人脸检测器获得更高的准确度和更稳健的人脸检测,但 OpenCV 的 Haar 级联仍然有其用武之地:
即使在资源受限的设备上,它们也非常快
Haar 级联模型尺寸很小(930 KB)
是的,Haar 级联存在一些问题,即它们容易出现误报检测,并且准确率低于 HOG + Linear SVM、SSD、YOLO 等同类算法。但是,它们仍然有用且实用,尤其是在资源受限的设备上。
今天您将学习如何使用 OpenCV 进行人脸检
6.OpenCV Haar Cascades
在本教程中,您将了解 OpenCV Haar Cascades 以及如何将它们应用于实时视频流。
Haar 级联算法最早由 Viola 和 Jones 在他们于 2001 年发表的开创性出版物《使用增强简单特征级联进行快速物体检测》中提出,可以说是 OpenCV最流行的物体检测算法。
当然,许多算法比 Haar 级联(HOG + Linear SVM、SSD、Faster R-CNN、YOLO 等)更准确,但它们在今天仍然具有相关性和实用性。
Haar 级联的主要优点之一是它们的速度非常快 —— 很难超越它们的速度。
Haar 级联的缺点是它们往往容易出现假阳性检测,在用于推理/检测时需要进行参数调整,并且总体上不如我们今天拥有的更“现代”的算法那么准确。
也就是说,Haar 级联是:
计算机视觉和图像处理文献的重要组成部分
仍与OpenCV一起使用
仍然有用,特别是在资源受限的设备中,当我们无法使用计算成本更高的物体检测器时
在本教程的剩余部分,您将了解 Haar 级联,包括如何将它们与 OpenCV 一起使用。
5.使用 dlib(HOG 和 CNN)进行人脸检测(Python代码、包括数据集)
dlib 库可以说是人脸识别中最常用的软件包face_recognition之一。一个名字恰当的 Python 软件包将 dlib 的人脸识别功能包装成一个简单易用的 API。
人脸检测的复杂性要求有大量的人脸数据。拥有多样化、精心策划的数据集对于创建能够处理姿势、表情和光照条件变化的模型至关重要。
Roboflow为计算机视觉管道的每个阶段提供免费工具,可简化您的工作流程并提高您的工作效率。
注册或登录您的Roboflow 帐户以访问最先进的数据集库并彻底改变您的计算机视觉管道。
您可以先选择自己的数据集,或者使用各种有用的数据集库。
将 40 多种格式的数据引入Roboflow,使用任何最先进的模型架构进行训练,跨多个平台(API、NVIDIA、浏览器、iOS 等)部署,并连接到应用程序或第三方工具。
4.使用本地二进制模式(LBP)和OpenCV(Python代码、包括数据集)
在本教程中,您将学习如何使用局部二元模式 (LBP)、OpenCV 和函数执行人脸识别。
在我们之前的教程中,我们讨论了人脸识别的基础知识,包括:
人脸检测和人脸识别的区别
人脸识别算法的工作原理
经典人脸识别方法与基于深度学习的人脸识别器的区别
今天我们将首次尝试通过局部二元模式算法实现人脸识别。在本教程结束时,您将能够实现您的第一个人脸识别系统。
要了解如何使用 LBP 和 OpenCV 进行人脸识别,请继续阅读。
正在寻找这篇文章的源代码?
直接跳至下载部分
使用局部二值模式 (LBP) 和 OpenCV 进行人脸识别
在本教程的第一部分,我们将讨论人脸识别算法的 LBP,包括其工作原理。
然后我们将配置我们的开发环境并检查我们的项目目录结构。
然后我将向您展示如何使用 OpenCV 实现用于人脸识别的 LBP。
人脸识别算法的局部二值模式(LBP)
我们今天介绍的人脸识别算法最早是由 Ahonen 等人在 2004 年出版的《基于局部二元模式的人脸识别》中提出的。
3.用于面部识别的OpenCV特征脸(Python代码,包括数据集,可运行)
在本教程中,您将学习如何使用 Eigenfaces 算法、OpenCV 和 scikit-learn 实现人脸识别。
介绍了人脸识别的概念,使用 CALTECH Faces 数据集。
Eigenfaces 的第一步是提供一组图像,其中包含您想要识别的每个人的多张图像。
然后,我们将每幅图像展平为一个向量,并将它们存储在一个矩阵中。主成分分析应用于这个矩阵,我们取具有相应最大特征值幅度的前N 个特征向量——这N 个特征向量就是我们的特征脸。
对于许多机器学习算法来说,通常很难将特定方法的结果可视化。但对于特征脸来说,这实际上很容易!每个特征脸只是一个K^{2}扁平矢量,可以重新整形为K \乘以 K图像,使我们能够看到每个特征脸。
为了识别人脸,我们首先将图像投影到特征脸子空间,然后利用具有欧几里得距离的 k-NN 分类器来查找最近邻居。这些最近邻居用于确定整体识别。但是,我们可以通过使用更高级的机器学习算法进一步提高准确性,这正是我们在本课中所做的。
2.使用scikit-learn和Python进行超参数调整(Python代码,包括数据集)
在本教程中,您将学习如何使用 scikit-learn 和 Python 调整模型超参数。
我们将从讨论什么是超参数调整以及它为什么如此重要来开始本教程。
从那里,我们将配置您的开发环境并检查项目目录结构。
然后我们将执行三个 Python 脚本:
1.无需调整超参数即可训练模型(这样我们就可以获得基线)
2.一种是利用一种称为“网格搜索”的算法来详尽检查所有超参数组合的方法——这种方法保证对超参数值进行全面扫描,但速度也很慢
3.最后一种方法是使用“随机搜索”,从分布中抽取各种超参数(不能保证覆盖所有超参数值,但在实践中通常与网格搜索一样准确,而且运行速度更快)
1.使用scikit-learn(GridSearchCV)进行网格搜索超参数调整(Python代码,包括数据集)
在本教程中,您将学习如何使用该类GridSearchCV通过 scikit-learn 机器学习库进行网格搜索超参数调整。我们将网格搜索应用于计算机视觉项目。
我们将讨论:
1.什么是网格搜索
2.如何将网格搜索应用于超参数调整
3.scikit-learn 机器学习库如何通过网格搜索
从那里,我们将配置我们的开发环境并检查我们的项目目录结构。
然后,我将向您展示如何使用计算机视觉、机器学习和网格搜索超参数调整来将参数调整到纹理识别管道,从而产生一个接近 100% 纹理识别准确率的系统。