目标
在本教程中,您将学习:
- 什么是梯度结构张量
- 如何通过梯度结构张量估计各向异性图像的方向和相干性
- 如何通过梯度结构张量分割具有单个局部方向的各向异性图像
理论
什么是梯度结构张量?
在数学中,梯度结构张量(也称为二阶矩矩阵、二阶矩矩张量、惯性张量等)是由函数的梯度推导出来的矩阵。它总结了点的指定邻域中梯度的主要方向,以及这些方向的相干程度(相干性)。梯度结构张量广泛应用于图像处理和计算机视觉的2D/3D图像分割、运动检测、自适应滤波、局部图像特征检测等。
各向异性图像的重要特征包括局部各向异性的方向和相干性。在本文中,我们将展示如何估计方向和相干性,以及如何通过梯度结构张量分割具有单个局部方向的各向异性图像。
图像的梯度结构张量是一个 2x2 对称矩阵。梯度结构张量的特征向量表示局部方向,而特征值表示相干性(各向异性的度量)。
图像 Z 的梯度结构张量 可以写成:JZ
其中 J_{11} = M[Z_{x}^{2}], J_{22} = M[Z_{y}^{2}], J_{12} = M[Z_{x}Z_{y}] - 张量的分量, M[] 是数学期望的符号(我们可以将此操作视为窗口 w 中的平均值), Z_{x} 和 Z_{y} 是图像 Z 相对于 x 和 y 的偏导数。 J11=M[Z2x]J22=M[Z2y]J12=M[ZxZy]M[]ZxZyZxy
其中 \lambda_1 - 最大特征值,\lambda_2 - 最小特征值。λ1λ2
如何通过梯度结构张量估计各向异性图像的方向和相干性?
各向异性图像的方向:
一致性:
一致性范围从 0 到 1。对于理想的局部取向 ( \lambda_2 = 0, \lambda_1 > 0) 它是 1,对于各向同性的灰度值结构 ( \lambda_1 = \lambda_2 > 0 ) 它是零。λ2λ1λ1λ2
源代码 C++蟒
您可以在 OpenCV 源代码库中找到源代码。samples/cpp/tutorial_code/ImgProc/anisotropic_image_segmentation/anisotropic_image_segmentation.cpp
#include < iostream>
#include “opencv2/highgui.hpp”
#include“opencv2/imgproc.hpp”
#include“opencv2/imgcodecs.hpp”
使用命名空间 CV;
使用命名空间 std;
void calcGST(const Mat& inputImg, Mat&imgCoherencyOut, Mat&imgOrientationOut, int w);
int main() 函数
{
intW = 52;窗口大小为 WxW
双C_Thr = 0.43;一致性阈值
int低 Thr = 35;threshold1 表示方向,范围为 0 到 180
int高 Thr = 57;threshold2 表示方向,范围为 0 到 180
示例::addSamplesDataSearchSubDirectory(“doc/tutorials/imgproc/anisotropic_image_segmentation/images”);
Mat imgIn = imread(samples::findFile(“gst_input.jpg”), IMREAD_GRAYSCALE);
如果 (imgIn.empty()) //检查图片是否加载完毕
{
cout << “错误:无法加载图像…!!” << endl;
返回 -1;
}
Mat imgCoherency、imgOrientation;
calcGST(imgIn, imgCoherency, imgOrientation, W);
垫imgCoherencyBin;
imgCoherencyBin = img相干性> C_Thr;
Mat imgOrientationBin;
inRange(imgOrientation, Scalar(LowThr), Scalar(HighThr), imgOrientationBin);
Mat imgBin;
imgBin = imgCoherencyBin & imgOrientationBin;
归一化(imgCoherency, imgCoherency, 0, 255, NORM_MINMAX, CV_8U);
normalize(imgOrientation, imgOrientation, 0, 255, NORM_MINMAX, CV_8U);
imshow(“原始”, imgIn);
imshow(“结果”, 0.5 * (imgIn + imgBin));
imshow(“连贯性”, img连贯性);
imshow(“方向”, imgOrientation);
imwrite(“结果.jpg”, 0.5*(imgIn + imgBin));
imwrite(“连贯性.jpg”, img连贯性);
imwrite(“方向.jpg”, imgOrientation);
waitKey(0);
返回 0;
}
void calcGST(const Mat& inputImg, Mat&imgCoherencyOut, Mat&imgOrientationOut, int w)
{
垫子img;
GST组成部分计算(开始)
J = (J11 J12;J12 J22) - 消费税
Mat imgDiffX、imgDiffY、imgDiffXY;
索贝尔(img, imgDiffX, CV_32F, 1, 0, 3);
索贝尔(img, imgDiffY, CV_32F, 0, 1, 3);
乘法(imgDiffX, imgDiffY, imgDiffXY);
Mat imgDiffXX, imgDiffYY;
乘法(imgDiffX, imgDiffX, imgDiffXX);
乘法(imgDiffY, imgDiffY, imgDiffYY);
席J11、J22、J12;J11、J22 和 J12 是 GST 组件
boxFilter(imgDiffXX, J11, CV_32F, Size(w, w));
boxFilter(imgDiffYY, J22, CV_32F, Size(w, w));
boxFilter(imgDiffXY, J12, CV_32F, Size(w, w));
GST组成部分计算(停止)
特征值计算 (START)
lambda1 = 0.5*(J11 + J22 + sqrt((J11-J22)^2 + 4*J12^2))
lambda2 = 0.5*(J11 + J22 - sqrt((J11-J22)^2 + 4*J12^2))
垫子 tmp1、tmp2、tmp3、tmp4;
tmp1 = J11 + J22;
tmp2 = J11 - J22;
乘法(tmp2, tmp2, tmp2);
乘法(J12, J12, tmp3);
平方(TMP2 + 4.0 * TMP3, TMP4);
垫 lambda1、lambda2;
lambda1 = TMP1 + TMP4;
lambda1 = 0.5*lambda1;最大特征值 //
lambda2 = TMP1 - TMP4;
lambda2 = 0.5*lambda2;最小特征值
特征值计算(停止)
相干性计算(开始)
Coherency = (lambda1 - lambda2)/(lambda1 + lambda2)) - 各向异性的测量
相干性是各向异性程度(局部取向的一致性)
divide(lambda1 - lambda2, lambda1 + lambda2, imgCoherencyOut);
相干性计算(停止)
方向角计算(START)
tan(2阿尔法) = 2J12/(J22 - J11)
阿尔法 = 0.5 atan2(2*J12/(J22 - J11))
相位(J22 - J11, 2.0*J12, imgOrientationOut, true);
imgOrientationOut = 0.5*imgOrientationOut;
方向角计算(停止)
}
解释 C++蟒
各向异性图像分割算法由梯度结构张量计算、方向计算、相干性计算以及方向和相干度阈值组成:
Mat imgCoherency、imgOrientation;
calcGST(imgIn, imgCoherency, imgOrientation, W);
垫imgCoherencyBin;
imgCoherencyBin = img相干性> C_Thr;
Mat imgOrientationBin;
inRange(imgOrientation, Scalar(LowThr), Scalar(HighThr), imgOrientationBin);
Mat imgBin;
imgBin = imgCoherencyBin & imgOrientationBin;
函数 calcGST() 使用梯度结构张量计算方向和连贯性。输入参数 w 定义窗口大小:
void calcGST(const Mat& inputImg, Mat&imgCoherencyOut, Mat&imgOrientationOut, int w)
{
垫子img;
GST组成部分计算(开始)
J = (J11 J12;J12 J22) - 消费税
Mat imgDiffX、imgDiffY、imgDiffXY;
索贝尔(img, imgDiffX, CV_32F, 1, 0, 3);
索贝尔(img, imgDiffY, CV_32F, 0, 1, 3);
乘法(imgDiffX, imgDiffY, imgDiffXY);
Mat imgDiffXX, imgDiffYY;
乘法(imgDiffX, imgDiffX, imgDiffXX);
乘法(imgDiffY, imgDiffY, imgDiffYY);
垫子 J11、J22、J12;J11、J22 和 J12 是 GST 组件
boxFilter(imgDiffXX, J11, CV_32F, Size(w, w));
boxFilter(imgDiffYY, J22, CV_32F, Size(w, w));
boxFilter(imgDiffXY, J12, CV_32F, Size(w, w));
GST组成部分计算(停止)
特征值计算 (START)
lambda1 = 0.5*(J11 + J22 + sqrt((J11-J22)^2 + 4*J12^2))
lambda2 = 0.5*(J11 + J22 - sqrt((J11-J22)^2 + 4*J12^2))
垫子 tmp1、tmp2、tmp3、tmp4;
tmp1 = J11 + J22;
tmp2 = J11 - J22;
乘法(tmp2, tmp2, tmp2);
乘法(J12, J12, tmp3);
平方(TMP2 + 4.0 * TMP3, TMP4);
垫 lambda1、lambda2;
lambda1 = TMP1 + TMP4;
lambda1 = 0.5*lambda1;最大特征值 //
lambda2 = TMP1 - TMP4;
lambda2 = 0.5*lambda2;最小特征值
特征值计算(停止)
相干性计算(开始)
Coherency = (lambda1 - lambda2)/(lambda1 + lambda2)) - 各向异性的测量
相干性是各向异性程度(局部取向的一致性)
divide(lambda1 - lambda2, lambda1 + lambda2, imgCoherencyOut);
相干性计算(停止)
方向角计算(START)
tan(2阿尔法) = 2J12/(J22 - J11)
阿尔法 = 0.5 atan2(2*J12/(J22 - J11))
相位(J22 - J11, 2.0*J12, imgOrientationOut, true);
imgOrientationOut = 0.5*imgOrientationOut;
方向角计算(停止)
}
下面的代码将阈值 LowThr 和 HighThr 应用于图像方向,并将阈值C_Thr应用于由上一个函数计算的图像相干性。LowThr 和 HighThr 定义方向范围:
垫imgCoherencyBin;
imgCoherencyBin = img相干性> C_Thr;
Mat imgOrientationBin;
inRange(imgOrientation, Scalar(LowThr), Scalar(HighThr), imgOrientationBin);
最后,我们结合阈值结果:
Mat imgBin;
imgBin = imgCoherencyBin & imgOrientationBin;
结果
下面您可以看到单向的真实各向异性图像:
单向各向异性图像
下面您可以看到各向异性图像的方向和相干性:
取向
一致性
您可以在下面看到细分结果:
细分结果
结果是用 w = 52、C_Thr = 0.43、LowThr = 35、HighThr = 57 计算得出的。我们可以看到,该算法只选择了具有单一方向的区域
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
😝有需要的小伙伴,可以Vx扫描下方二维码免费领取==🆓