字典学习___字典是什么意思,纹理是什么意思
1、字典学习大概讲解
2、对于标题3图画中的一些概念解释
2.1 已知图像块 y和字典 D,去反推一个最稀疏的系数向量 x
y 是已知的(从原图切出来的 3×3 小块拉平成 9×1)。 D 是已知的(事先训练好的字典矩阵,9×780)。 x 是未知的(我们要找的 780×1 稀疏系数)。
这是一个线性方程组,但问题在于:
方程个数:只有 9 个(因为 y 是 9 维的)。未知数个数:有 780 个(因为字典有 780 个原子)。
9 个方程,780 个未知数——这意味着有无穷多组解。我们需要一个额外的约束条件来挑出“最好”的那组解。
我们要找的x,是最稀疏的那个解——也就是 x 里非零元素最少的那个。
2.2 字典矩阵 D 既可以直接用别人提供的(预训练字典),也可以自己用数据训练出来具体用哪种,取决于你的任务需求和数据情况
2.3 纹理字典中的纹理的含义
从原图里抠出来的那个小方块(图像块 patch),它本身就是“纹理”的具体体现。
如果你直接把原图切出来的几万个块原封不动地当成字典,那字典就太大了,而且有很多重复。
字典学习(比如 K-SVD)做的事情就是:把这几万个块放在一起,找出其中最具代表性、最核心的几种模式,提炼成 780 个“标准件”。这 780 个“标准件”(原子),其实就是纹理的基本构成单元。比如:
有的原子代表“水平边缘”
有的原子代表“垂直边缘”
有的原子代表“斑点”
有的原子代表“斜向纹理”
这些原子,就是数学化、抽象化之后的“纹理特征”。
2.4 为什么用字典能区分草地和砖墙?
草地的小块,在字典里找到的稀疏表示 xx,可能是由“杂乱斑点+高频波动”这几个原子组合而成。
砖墙的小块,在字典里找到的稀疏表示 xx,可能是由“规则边缘+特定方向阶跃”这几个原子组合而成。
草地的“字母组合”和砖墙的“字母组合”是不一样的,所以算法就能把它们区分开。
字典 = 纹理的“字母表”;稀疏系数 xx = 拼写单词的“字母组合”
3、字典,画图加深理解,以html形式呈现
点击查看代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>稀疏表示 · 图像块与字典 · 图解</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: #f2f7fb;
font-family: 'Segoe UI', system-ui, -apple-system, Roboto, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: 2rem 1rem;
}
.container {
max-width: 1100px;
width: 100%;
background: white;
border-radius: 2.5rem;
box-shadow: 0 20px 40px -12px rgba(0, 0, 0, 0.15);
padding: 2rem 2rem 2.5rem;
}
h1 {
font-size: 1.8rem;
font-weight: 600;
color: #1a3a4a;
display: flex;
align-items: center;
gap: 0.75rem;
border-left: 8px solid #2c7a7b;
padding-left: 1.25rem;
margin-bottom: 1.5rem;
}
h1 span {
background: #e6fffa;
color: #1d4e5f;
font-size: 1rem;
font-weight: 400;
padding: 0.2rem 0.9rem;
border-radius: 3rem;
margin-left: 0.75rem;
}
.row {
display: flex;
flex-wrap: wrap;
gap: 2rem;
margin-bottom: 2rem;
align-items: flex-start;
justify-content: center;
}
.card {
background: #ffffff;
border-radius: 1.8rem;
padding: 1.5rem 1.5rem 1.8rem;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.05);
border: 1px solid #e2edf2;
flex: 1 1 280px;
display: flex;
flex-direction: column;
align-items: center;
}
.card h2 {
font-size: 1.2rem;
font-weight: 600;
color: #0b4d5e;
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
width: 100%;
border-bottom: 2px solid #e2edf2;
padding-bottom: 0.5rem;
}
.badge {
font-size: 0.75rem;
background: #d4e9f2;
color: #0b4d5e;
padding: 0.15rem 0.65rem;
border-radius: 30px;
font-weight: 500;
margin-left: auto;
}
.grid-vis {
display: grid;
gap: 4px;
background: #d0e2ea;
padding: 6px;
border-radius: 12px;
box-shadow: inset 0 2px 6px rgba(0,0,0,0.05);
}
.cell {
width: 38px;
height: 38px;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Courier New', monospace;
font-weight: 700;
font-size: 0.9rem;
transition: all 0.15s;
cursor: default;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
}
.cell.grass {
background: #8bc34a;
color: #2e5a0e;
}
.cell.brick {
background: #c97b5d;
color: #5a1e0a;
}
.cell.gray {
background: #b0bec5;
color: #1e2f3a;
}
.cell.highlight {
box-shadow: 0 0 0 3px #ff9800, 0 4px 12px rgba(255, 152, 0, 0.4);
transform: scale(1.05);
z-index: 2;
}
.patch-label {
font-size: 0.8rem;
color: #4a6572;
margin-top: 0.5rem;
font-weight: 500;
}
.arrow-row {
display: flex;
align-items: center;
justify-content: center;
gap: 1rem;
font-size: 1.8rem;
color: #4a7a8a;
flex-wrap: wrap;
margin: 0.5rem 0;
}
.vector-box {
background: #f9fdfe;
border-radius: 1rem;
padding: 1rem 1.5rem;
border: 2px dashed #8fc9db;
text-align: center;
min-width: 140px;
}
.vector-box .symbol {
font-size: 1.5rem;
font-weight: 700;
font-family: 'Courier New', monospace;
}
.vector-box .label {
font-size: 0.8rem;
color: #4a6572;
margin-top: 0.3rem;
}
.y-symbol { color: #dd6b20; }
.d-symbol { color: #3182ce; }
.x-symbol { color: #38a169; }
.formula-big {
display: flex;
align-items: center;
justify-content: center;
gap: 1.2rem;
font-size: 2rem;
font-weight: 700;
font-family: 'Courier New', monospace;
padding: 1rem 0;
flex-wrap: wrap;
}
.formula-big .eq { color: #2d3748; font-size: 1.8rem; }
.formula-big .times { color: #2d3748; font-size: 1.5rem; }
.annotation {
font-size: 0.9rem;
color: #4a6572;
margin-top: 0.8rem;
padding: 0.6rem 1rem;
background: #edf2f7;
border-radius: 0.8rem;
border-left: 4px solid #a0c4d4;
width: 100%;
text-align: center;
}
.footnote {
text-align: center;
margin-top: 2rem;
font-size: 0.9rem;
color: #4a6572;
border-top: 1px solid #d0e2ea;
padding-top: 1.5rem;
font-style: italic;
}
.highlight-box {
background: #fefcbf;
padding: 0.1rem 0.4rem;
border-radius: 0.3rem;
font-weight: 600;
color: #744210;
}
.dictionary-demo {
display: flex;
flex-wrap: wrap;
gap: 1rem;
justify-content: center;
margin-top: 0.5rem;
}
.atom-mini {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 2px;
background: #e2edf2;
padding: 4px;
border-radius: 8px;
}
.atom-mini .cell {
width: 20px;
height: 20px;
font-size: 0.55rem;
border-radius: 3px;
}
.small-note {
font-size: 0.8rem;
color: #718096;
margin-top: 0.3rem;
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<h1>
🧩 稀疏表示 · 图像块与字典
<span>从原图到原子</span>
</h1>
<!-- 第一步:原图 -->
<div class="card" style="margin-bottom: 1.5rem;">
<h2>🖼️ 第一步:原图(草地 vs 砖墙) <span class="badge">抽象示意</span></h2>
<div style="display: flex; justify-content: center; gap: 2rem; flex-wrap: wrap; margin: 1rem 0;">
<div style="text-align: center;">
<div style="font-weight: 600; color: #2e5a0e; margin-bottom: 0.4rem;">草地区域</div>
<div class="grid-vis" style="grid-template-columns: repeat(4, 1fr);">
<div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div>
<div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div>
<div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div>
<div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div><div class="cell grass">🌿</div>
</div>
</div>
<div style="text-align: center;">
<div style="font-weight: 600; color: #5a1e0a; margin-bottom: 0.4rem;">砖墙区域</div>
<div class="grid-vis" style="grid-template-columns: repeat(4, 1fr);">
<div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div>
<div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div>
<div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div>
<div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div><div class="cell brick">🧱</div>
</div>
</div>
</div>
<div class="annotation">
⬆️ 这只是抽象示意。真实图像是像素矩阵,但为了方便理解,我们用图标代替。
</div>
</div>
<!-- 第二步:切块 -->
<div class="row">
<div class="card" style="flex: 1 1 350px;">
<h2>✂️ 第二步:滑动窗口切出 3×3 小块 <span class="badge">Patch</span></h2>
<div style="display: flex; justify-content: center; gap: 2rem; flex-wrap: wrap; margin: 0.8rem 0;">
<!-- 草地切块 -->
<div style="text-align: center;">
<div style="font-weight: 600; color: #2e5a0e; margin-bottom: 0.4rem;">从草地切一块</div>
<div class="grid-vis" style="grid-template-columns: repeat(4, 1fr);">
<div class="cell grass" style="opacity:0.4;">🌿</div><div class="cell grass" style="opacity:0.4;">🌿</div><div class="cell grass" style="opacity:0.4;">🌿</div><div class="cell grass" style="opacity:0.4;">🌿</div>
<div class="cell grass" style="opacity:0.4;">🌿</div><div class="cell grass highlight">🌿</div><div class="cell grass highlight">🌿</div><div class="cell grass highlight">🌿</div>
<div class="cell grass" style="opacity:0.4;">🌿</div><div class="cell grass highlight">🌿</div><div class="cell grass highlight">🌿</div><div class="cell grass highlight">🌿</div>
<div class="cell grass" style="opacity:0.4;">🌿</div><div class="cell grass highlight">🌿</div><div class="cell grass highlight">🌿</div><div class="cell grass highlight">🌿</div>
</div>
<div class="patch-label">选中的 3×3 块</div>
</div>
<!-- 砖墙切块 -->
<div style="text-align: center;">
<div style="font-weight: 600; color: #5a1e0a; margin-bottom: 0.4rem;">从砖墙切一块</div>
<div class="grid-vis" style="grid-template-columns: repeat(4, 1fr);">
<div class="cell brick" style="opacity:0.4;">🧱</div><div class="cell brick" style="opacity:0.4;">🧱</div><div class="cell brick" style="opacity:0.4;">🧱</div><div class="cell brick" style="opacity:0.4;">🧱</div>
<div class="cell brick" style="opacity:0.4;">🧱</div><div class="cell brick highlight">🧱</div><div class="cell brick highlight">🧱</div><div class="cell brick highlight">🧱</div>
<div class="cell brick" style="opacity:0.4;">🧱</div><div class="cell brick highlight">🧱</div><div class="cell brick highlight">🧱</div><div class="cell brick highlight">🧱</div>
<div class="cell brick" style="opacity:0.4;">🧱</div><div class="cell brick highlight">🧱</div><div class="cell brick highlight">🧱</div><div class="cell brick highlight">🧱</div>
</div>
<div class="patch-label">选中的 3×3 块</div>
</div>
</div>
<div class="annotation">
💡 图像块就是原图里<strong>抠出来的一个小方块</strong>,尺寸通常是 3×3、5×5、7×7 等。
</div>
</div>
<!-- 第三步:拉平成向量 -->
<div class="card" style="flex: 1 1 250px;">
<h2>📏 第三步:拉平成 9×1 向量 <span class="badge">y</span></h2>
<div style="display: flex; flex-direction: column; align-items: center; gap: 1rem; margin: 0.8rem 0;">
<div style="display: flex; align-items: center; gap: 1.5rem; flex-wrap: wrap; justify-content: center;">
<!-- 草地小块拉平 -->
<div style="text-align: center;">
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 3px; background: #e2edf2; padding: 5px; border-radius: 10px;">
<div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div><div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div><div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div>
<div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div><div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div><div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div>
<div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div><div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div><div class="cell grass" style="width:26px; height:26px; font-size:0.7rem;">🌿</div>
</div>
<div style="font-size:0.75rem; color:#4a6572; margin-top:4px;">3×3 块</div>
</div>
<div style="font-size:2rem; color:#4a7a8a;">→</div>
<div style="display: flex; flex-direction: column; align-items: center;">
<div style="display: flex; flex-direction: column; gap: 2px; background: #f9fdfe; padding: 6px 12px; border-radius: 10px; border: 2px solid #8fc9db;">
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">1</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">2</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">3</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">4</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">5</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">6</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">7</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">8</div>
<div style="font-size:0.7rem; color:#2e5a0e; font-weight:600;">9</div>
</div>
<div style="font-size:0.8rem; font-weight:600; color:#dd6b20; margin-top:4px;">y (9×1)</div>
</div>
</div>
</div>
<div class="annotation">
📐 把 3×3 的像素块按顺序排成一列,就变成了 9×1 的向量 <strong>y</strong>。
</div>
</div>
</div>
<!-- 第四步:字典乘法 -->
<div class="card" style="margin-bottom: 1.5rem;">
<h2>🧮 第四步:用字典拼出 y <span class="badge">y ≈ D · x</span></h2>
<div class="formula-big">
<span class="y-symbol">y</span>
<span class="eq">=</span>
<span class="d-symbol">D</span>
<span class="times">×</span>
<span class="x-symbol">x</span>
</div>
<div style="display: flex; justify-content: center; gap: 2rem; flex-wrap: wrap; font-size: 0.9rem; color: #2d3748; margin-bottom: 1rem;">
<div style="text-align:center;">
<span style="background:#f6ad55; padding:0.2rem 0.8rem; border-radius:0.5rem; color:white; font-weight:600;">y (9×1)</span>
<div style="font-size:0.8rem; color:#4a6572; margin-top:0.2rem;">图像块向量</div>
</div>
<div style="text-align:center;">
<span style="background:#63b3ed; padding:0.2rem 0.8rem; border-radius:0.5rem; color:white; font-weight:600;">D (9×780)</span>
<div style="font-size:0.8rem; color:#4a6572; margin-top:0.2rem;">字典矩阵(780个原子)</div>
</div>
<div style="text-align:center;">
<span style="background:#68d391; padding:0.2rem 0.8rem; border-radius:0.5rem; color:white; font-weight:600;">x (780×1)</span>
<div style="font-size:0.8rem; color:#4a6572; margin-top:0.2rem;">稀疏系数(大多数为0)</div>
</div>
</div>
<!-- 字典原子示意 -->
<div style="margin-top: 1rem;">
<div style="font-weight:600; color:#0b4d5e; margin-bottom:0.5rem;">🎯 字典 D 里的原子(每个都是 3×3 的小模式):</div>
<div class="dictionary-demo">
<div style="text-align:center;">
<div class="atom-mini">
<div class="cell blue" style="width:20px;height:20px;font-size:0.55rem;background:#63b3ed;color:white;">1</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div>
<div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell blue" style="width:20px;height:20px;font-size:0.55rem;background:#63b3ed;color:white;">1</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div>
<div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell blue" style="width:20px;height:20px;font-size:0.55rem;background:#63b3ed;color:white;">1</div>
</div>
<div class="small-note">原子 1 (对角)</div>
</div>
<div style="text-align:center;">
<div class="atom-mini">
<div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell green" style="width:20px;height:20px;font-size:0.55rem;background:#68d391;color:white;">1</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div>
<div class="cell green" style="width:20px;height:20px;font-size:0.55rem;background:#68d391;color:white;">1</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell green" style="width:20px;height:20px;font-size:0.55rem;background:#68d391;color:white;">1</div>
<div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell green" style="width:20px;height:20px;font-size:0.55rem;background:#68d391;color:white;">1</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div>
</div>
<div class="small-note">原子 2 (十字)</div>
</div>
<div style="text-align:center;">
<div class="atom-mini">
<div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div>
<div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div>
<div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div><div class="cell gray" style="width:20px;height:20px;font-size:0.55rem;background:#e2e8f0;color:#4a5568;">0</div>
</div>
<div class="small-note">... 其他原子 ...</div>
</div>
</div>
<div class="annotation" style="margin-top:1rem;">
💡 原子就是字典里的<strong>“基本笔画”</strong>。用 x 里非零的系数,挑出少数几个原子,加权组合,就能近似拼出 y。
</div>
</div>
</div>
<!-- 总结 -->
<div style="display: flex; flex-wrap: wrap; gap: 1rem; justify-content: center; margin-top: 1rem;">
<div style="background: #e6fffa; padding: 0.8rem 1.5rem; border-radius: 2rem; font-weight: 500; color: #1d4e5f; border: 1px solid #81e6d9;">
📌 y = 原图切出的 3×3 小块拉平
</div>
<div style="background: #ebf8ff; padding: 0.8rem 1.5rem; border-radius: 2rem; font-weight: 500; color: #2a4365; border: 1px solid #90cdf4;">
📌 D = 字典矩阵(780个原子)
</div>
<div style="background: #f0fff4; padding: 0.8rem 1.5rem; border-radius: 2rem; font-weight: 500; color: #22543d; border: 1px solid #9ae6b4;">
📌 x = 稀疏系数(大多数为0)
</div>
</div>
<div class="footnote">
⚡ 图像块就是原图的一部分;原子是构建图像块的基本模式;x 告诉我们要用哪些原子来拼。
</div>
</div>
</body>
</html>
浙公网安备 33010602011771号