<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>编程 on 红旗下的蛋</title><link>https://blog.fallleaf.net/tags/programming/</link><description>Recent content in 编程 on 红旗下的蛋</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>fallleaf</copyright><lastBuildDate>Thu, 04 Sep 2025 10:45:00 +0800</lastBuildDate><atom:link href="https://blog.fallleaf.net/tags/programming/index.xml" rel="self" type="application/rss+xml"/><item><title>【人工智能+】系列（二）：从概念到落地，30分钟搭建你的“战略型第二大脑”</title><link>https://blog.fallleaf.net/p/tech-second-brain-with-n8n/</link><pubDate>Thu, 04 Sep 2025 10:45:00 +0800</pubDate><guid>https://blog.fallleaf.net/p/tech-second-brain-with-n8n/</guid><description>&lt;img src="https://blog.fallleaf.net/p/tech-second-brain-with-n8n/cover.webp" alt="Featured image of post 【人工智能+】系列（二）：从概念到落地，30分钟搭建你的“战略型第二大脑”" /&gt;&lt;p&gt;这篇文章，主要是介绍如何在 n8n 上建立一个&amp;quot; 第二大脑&amp;quot; 的工作流，内容比较枯燥，如果想立即尝试，见文章最后的📎&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;这篇文章，主要是介绍如何在 n8n 上建立一个&amp;quot; 第二大脑&amp;quot; 的工作流，内容比较枯燥，如果想立即尝试，见文章最后的📎 配套资源 ，获取一键导入的 n8n 配置文件。在导入之前，确保 n8n、ollama 和 Qwen 都正常运行，相关安装方法，见网上教程。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="引言我们为什么需要第二大脑"&gt;引言：我们为什么需要“第二大脑”？
&lt;/h2&gt;&lt;p&gt;在通信行业，每一份战略规划都承载着对未来的判断。它不仅要基于历史经验、试点反馈，更要精准对齐高层意图，并洞察竞争格局。&lt;/p&gt;
&lt;p&gt;然而，信息散落在 OA、本地磁盘、会议纪要中，专家常常陷入“找资料比写方案还累”的困境。&lt;/p&gt;
&lt;p&gt;而我们在上篇提出的解决方案是：打造一个能“ &lt;strong&gt;感知任务、融合知识、生成框架&lt;/strong&gt; ”的“战略型第二大脑”。&lt;/p&gt;
&lt;p&gt;现在，是时候兑现承诺了。&lt;/p&gt;
&lt;p&gt;本文将带您 &lt;strong&gt;从零开始，用开源工具本地搭建一个可用的“第二大脑”&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;一个基于 n8n + Ollama + Qwen 的智能系统，流程如下图：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;战略生成流程知识库模块读取目录文件切分文本Ollama 向量化存入 Simple Vector Store任务输入感知模块融合模块查询 Vector Store Tool生成模块输出初稿专家介入
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;知识库模块&lt;/strong&gt; ：构建企业“战略记忆中枢”，将散落的文档转化为可检索、可追溯、可进化的智能资产。&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;感知模块&lt;/strong&gt; ：听懂任务背后的“弦外之音”，解析出关键词与战略意图。&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;融合模块&lt;/strong&gt; ：激活企业“沉睡的知识资产”，实现跨文档、跨时间的语义关联。&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;生成模块&lt;/strong&gt; ：基于上下文，自动生成逻辑清晰、结构完整的方案初稿。&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;专家介入&lt;/strong&gt; ：最终决策与洞见注入，人机协同产出真正有价值的方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这套系统能否成功，80% 取决于知识库的质量，20% 取决于技术实现的合理性。接下来，我们就来一步步构建它。&lt;/p&gt;
&lt;h2 id="步骤-1打造可进化的战略知识库"&gt;步骤 1：打造可进化的“战略知识库”
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;🎯 目标：将分散的 &lt;code&gt;.txt&lt;/code&gt; 文件自动转化为结构化、可语义检索的知识资产。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="1-节点-1读取指定目录下的所有文本文件readwrite-file"&gt;1. 节点 1：读取指定目录下的所有文本文件（Read/Write File）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;节点名称&lt;/strong&gt; ： &lt;code&gt;资料输入&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;节点类型&lt;/strong&gt; ： &lt;code&gt;n8n-nodes-base.readWriteFile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;配置&lt;/strong&gt; ：
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;fileSelector&amp;#34;: &amp;#34;d:\\\\second_brain_demo\\\\*&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;options&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;fileExtension&amp;#34;: &amp;#34;.txt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;功能&lt;/strong&gt; ：扫描 &lt;code&gt;d:\second_brain_demo\&lt;/code&gt; 目录下所有 &lt;code&gt;.txt&lt;/code&gt; 文件，支持通配符。&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;输出&lt;/strong&gt; ：以二进制形式返回每个文件内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 可扩展支持 &lt;code&gt;.pdf&lt;/code&gt; 、&lt;code&gt;.docx&lt;/code&gt; ，但需确保 Ollama 支持解析。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="2-节点-2文本切分recursive-character-text-splitter"&gt;2. 节点 2：文本切分（Recursive Character Text Splitter）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;节点名称&lt;/strong&gt; ： &lt;code&gt;Recursive Character Text Splitter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;配置&lt;/strong&gt; ：
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;chunkSize&amp;#34;: 100,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;chunkOverlap&amp;#34;: 20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;作用&lt;/strong&gt; ：将长文本按字符递归切分为小片段，避免超出模型上下文。&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;切分逻辑&lt;/strong&gt; ：优先按 &lt;code&gt;\n\n&lt;/code&gt; 、 &lt;code&gt;\n&lt;/code&gt; 、 、&lt;code&gt;.&lt;/code&gt; 分割。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 注意：当前版本中，切分由该节点控制，而非 &lt;code&gt;Simple Vector Store&lt;/code&gt; 内置。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="3-节点-3调用-ollama-进行向量化embeddings-ollama"&gt;3. 节点 3：调用 Ollama 进行向量化（Embeddings Ollama）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;节点名称&lt;/strong&gt; ： &lt;code&gt;Embeddings Ollama&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;配置&lt;/strong&gt; ：
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;model&amp;#34;: &amp;#34;dengcao/bge-large-zh-v1.5:latest&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;功能&lt;/strong&gt; ：调用本地 Ollama 服务，使用中文优化的 &lt;code&gt;bge-large-zh&lt;/code&gt; 模型生成向量。&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;优势&lt;/strong&gt; ：专为中文语义设计，在“领导讲话”“试点报告”等场景表现优异。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ 需提前运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama pull dengcao/bge-large-zh-v1.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="4-节点-4存入向量数据库simple-vector-store"&gt;4. 节点 4：存入向量数据库（Simple Vector Store）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;节点名称&lt;/strong&gt; ： &lt;code&gt;Simple Vector Store&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;配置&lt;/strong&gt; ：&lt;/li&gt;
&lt;li&gt;• Mode: &lt;code&gt;insert&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;• Memory Key: &lt;code&gt;vector_store_key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;连接&lt;/strong&gt; ：&lt;/li&gt;
&lt;li&gt;• 输入文档 → &lt;code&gt;Default Data Loader&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;• 切分器 → &lt;code&gt;Recursive Character Text Splitter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• 嵌入模型 → &lt;code&gt;Embeddings Ollama&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ 数据将持久化在内存中，供后续查询使用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="-知识库构建流程总结"&gt;✅ 知识库构建流程总结
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;节点&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;资料输入&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;扫描目录，读取 &lt;code&gt;.txt&lt;/code&gt; 文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Recursive Character Text Splitter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按设定规则切分文本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Embeddings Ollama&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;使用 &lt;code&gt;bge-large-zh&lt;/code&gt; 生成中文向量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Simple Vector Store&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;存储为可检索的知识片段&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;🔄 此流程可绑定 &lt;code&gt;Cron Trigger&lt;/code&gt; ，实现 &lt;strong&gt;每日自动更新知识库&lt;/strong&gt; 。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="步骤-2构建懂战略的-ai-生成引擎"&gt;步骤 2：构建“懂战略”的 AI 生成引擎
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;🎯 目标：用户输入任务，AI 自动调用知识库，生成专业方案初稿。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="1-节点-1任务输入chat-trigger"&gt;1. 节点 1：任务输入（Chat Trigger）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;节点名称&lt;/strong&gt; ： &lt;code&gt;任务输入&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;类型&lt;/strong&gt; ： &lt;code&gt;@n8n/n8n-nodes-langchain.chatTrigger&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;作用&lt;/strong&gt; ：接收用户输入的任务指令，如：
“请基于历史方案和试点反馈，制定县乡传输网低成本演进路径”&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="2-节点-2感知模块ai-agent--知识检索"&gt;2. 节点 2：感知模块（AI Agent + 知识检索）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;节点名称&lt;/strong&gt; ： &lt;code&gt;感知模块&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;类型&lt;/strong&gt; ： &lt;code&gt;@n8n/n8n-nodes-langchain.agent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;核心配置&lt;/strong&gt; ：&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-使用的模型"&gt;📌 使用的模型
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;语言模型&lt;/strong&gt; ： &lt;code&gt;Qwen Turbo&lt;/code&gt; （通过 API 调用）&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;嵌入模型&lt;/strong&gt; ： &lt;code&gt;Ollama&lt;/code&gt; （用于检索）&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;记忆机制&lt;/strong&gt; ： &lt;code&gt;Window Buffer Memory&lt;/code&gt; （保留上下文）&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="-系统提示词system-message"&gt;📌 系统提示词（System Message）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;你是一名通信网络战略规划专家以及专业的任务分析助手。你的职责是分析用户的要求：&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chatInput&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="err"&gt;，根据查询知识库&lt;/span&gt; &lt;span class="n"&gt;company_documents_tool&lt;/span&gt; &lt;span class="err"&gt;中的相关内容&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;输出框架大纲。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;请严格遵守以下规则：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="err"&gt;内容从知识库&lt;/span&gt; &lt;span class="n"&gt;company_documents_tool&lt;/span&gt; &lt;span class="err"&gt;获取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="err"&gt;输出内容只包含“需要做什么”，不得加入额外解释&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="err"&gt;输出格式为&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="err"&gt;，必须包含：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;task&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;一句话说明要完成的具体任务&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;requirements&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;要求1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;要求2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="-工具绑定"&gt;📌 工具绑定
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;Vector Store Tool&lt;/strong&gt; ： &lt;code&gt;company_documents_tool&lt;/code&gt; ，用于检索知识库&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ 该模块将：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;• 解析用户意图&lt;/li&gt;
&lt;li&gt;• 自动调用知识库检索相关资料&lt;/li&gt;
&lt;li&gt;• 输出结构化任务框架&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="3-节点-3生成模块ai-agent--文档生成"&gt;3. 节点 3：生成模块（AI Agent + 文档生成）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;节点名称&lt;/strong&gt; ： &lt;code&gt;生成模块&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;类型&lt;/strong&gt; ： &lt;code&gt;@n8n/n8n-nodes-langchain.agent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;系统提示词&lt;/strong&gt; ：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;你是一名通信网络战略规划专家。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;你是一个专业的文档编写助手。你的任务是根据任务要求，仅使用知识库&lt;/span&gt; &lt;span class="n"&gt;company_documents_tool&lt;/span&gt; &lt;span class="err"&gt;提供的内容，生成最终文档。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;请严格遵守以下规则：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;1.&lt;/span&gt; &lt;span class="err"&gt;所有内容必须来自知识库，不得引入外部信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="err"&gt;可以在知识库范围内进行归纳、整合，但不得编造&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;3.&lt;/span&gt; &lt;span class="err"&gt;如果某项信息未找到，请写“相关信息未在知识库中找到”&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;4.&lt;/span&gt; &lt;span class="err"&gt;文风：简洁、正式、专业&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;✅ 输入来自“感知模块”的结构化任务框架，输出完整方案初稿。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id="-战略生成流程总结"&gt;✅ 战略生成流程总结
&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;节点&lt;/th&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;任务输入&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;接收用户指令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;感知模块&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;解析意图，调用知识库，输出任务框架&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;生成模块&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;基于框架与知识，生成专业文档&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;🔁 整个流程无需人工干预，AI 自主完成“理解 → 检索 → 生成”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="三关键连接模块如何协同工作"&gt;三、关键连接：模块如何协同工作？
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;连接&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;资料输入&lt;/code&gt; → &lt;code&gt;Simple Vector Store&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;触发知识入库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Embeddings Ollama&lt;/code&gt; → &lt;code&gt;Simple Vector Store&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提供中文向量能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Vector Store Tool&lt;/code&gt; ←→ &lt;code&gt;感知模块&lt;/code&gt; &amp;amp; &lt;code&gt;生成模块&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提供语义检索能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Qwen&lt;/code&gt; ←→ 所有 AI Agent 节点&lt;/td&gt;
&lt;td&gt;提供大模型推理能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Window Buffer Memory&lt;/code&gt; ←→ 两个 Agent&lt;/td&gt;
&lt;td&gt;支持多轮对话上下文&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;✅ 所有 AI 能力通过标准接口连接，模块化、可替换、可扩展。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="-知识库演示内容"&gt;📁 知识库演示内容
&lt;/h2&gt;&lt;p&gt;为确保 AI 能生成高质量方案，建议知识库包含以下五个测试文件, 均由 LLM 生成：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文件名&lt;/th&gt;
&lt;th&gt;内容重点&lt;/th&gt;
&lt;th&gt;示例片段&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;白皮书摘要.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;战略目标、技术路径&lt;/td&gt;
&lt;td&gt;“2027 年实现县乡 100% 光缆覆盖”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;试点报告.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;成功/ 失败经验&lt;/td&gt;
&lt;td&gt;“FgOTN 设备成本高达 45 万元”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;领导讲话.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;战略偏好&lt;/td&gt;
&lt;td&gt;“要注重投资效益，避免重复建设”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;友商应用情况.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;竞争情报&lt;/td&gt;
&lt;td&gt;“B 运营商采用 DCI-BOX，部署效率提升”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;设备对比资料.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;技术依据&lt;/td&gt;
&lt;td&gt;“DCI-BOX 成本比 OTN 低 30%-50%”&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="-重要说明与边界"&gt;⚠️ 重要说明与边界
&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama 必须运行&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ollama serve&lt;/code&gt; 需常驻后台&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;嵌入模型必须加载&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ollama pull dengcao/bge-large-zh-v1.5&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qwen Turbo 需 API 密钥&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;通过阿里云百炼平台获取&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;向量库存储在内存中&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;如需持久化，建议升级为 ChromaDB 或 FAISS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;必须人工审核&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ AI 输出仅作参考，不可直接用于决策&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="实战演示以县乡传输网演进为例"&gt;实战演示：以“县乡传输网演进”为例
&lt;/h2&gt;&lt;p&gt;让我们用一个真实场景验证系统效果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;任务输入&lt;/strong&gt; ：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;请结合《XX 网络 2025-2027 年演进白皮书》和DCI-BOX以及FgOTN试点情况，研究县乡本地传输网的演进方向。重点考虑低成本、可持续性和与国家‘新基建’政策的契合度。参考近期领导在务虚会上关于‘网络精简’和‘区域均衡’的讲话精神。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;感知模块调用融合模块输出&lt;/strong&gt; ：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;AI&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;&amp;#34;task&amp;#34;:&lt;/span&gt; &lt;span class="err"&gt;&amp;#34;编制县乡本地传输网发展建设指导意见&amp;#34;,&amp;#34;requirements&amp;#34;:&lt;/span&gt; &lt;span class="err"&gt;[&amp;#34;结合《XX&lt;/span&gt; &lt;span class="err"&gt;网络&lt;/span&gt; &lt;span class="err"&gt;2025-2027&lt;/span&gt; &lt;span class="err"&gt;年演进白皮书》的内容&amp;#34;,&amp;#34;分析DCI-BOX和FgOTN试点情况&amp;#34;,&amp;#34;制定县乡本地传输网发展建设指导意见&amp;#34;,&amp;#34;重点考虑低成本、可持续性&amp;#34;,&amp;#34;确保与国家‘新基建’政策的契合度&amp;#34;,&amp;#34;参考近期领导在务虚会上关于‘网络精简’和‘区域均衡’的讲话精神&amp;#34;],&amp;#34;rule&amp;#34;:&lt;/span&gt; &lt;span class="err"&gt;&amp;#34;必须采用company_documents_tool内的信息&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;生成模块调用融合模块输出初稿（语言模型不同，输出也不同）&lt;/strong&gt; ：&lt;/p&gt;
&lt;p&gt;县乡本地传输网发展建设指导意见&lt;/p&gt;
&lt;p&gt;一、总体目标&lt;/p&gt;
&lt;p&gt;根据《XX 网络 2025-2027 年演进白皮书》的指导思想，结合DCI-BOX和FgOTN试点情况，推动县乡本地传输网的高质量发展。以低成本、可持续性为核心，确保与国家“新基建”政策的契合度，同时落实领导在务虚会上关于“网络精简”和“区域均衡”的讲话精神。&lt;/p&gt;
&lt;p&gt;二、基本原则&lt;/p&gt;
&lt;p&gt;低成本：优先采用成熟、经济的技术方案，降低建设和运维成本。&lt;/p&gt;
&lt;p&gt;可持续性：注重资源的合理利用，确保网络长期稳定运行。&lt;/p&gt;
&lt;p&gt;政策契合度：紧密结合国家“新基建”政策，推动技术与政策的深度融合。&lt;/p&gt;
&lt;p&gt;网络精简：优化网络结构，提升效率，减少冗余。&lt;/p&gt;
&lt;p&gt;区域均衡：实现城乡网络协调发展，缩小数字鸿沟。&lt;/p&gt;
&lt;p&gt;三、重点任务&lt;/p&gt;
&lt;p&gt;技术选型&lt;/p&gt;
&lt;p&gt;推广DCI-BOX和FgOTN等先进技术，提升传输效率和灵活性。&lt;/p&gt;
&lt;p&gt;结合试点经验，逐步推广适用于县乡地区的解决方案。&lt;/p&gt;
&lt;p&gt;网络规划&lt;/p&gt;
&lt;p&gt;根据区域发展需求，制定合理的网络布局，确保覆盖全面。&lt;/p&gt;
&lt;p&gt;强化骨干网与接入网的协同，提升整体性能。&lt;/p&gt;
&lt;p&gt;政策支持&lt;/p&gt;
&lt;p&gt;积极争取国家“新基建”政策的支持，争取专项资金。&lt;/p&gt;
&lt;p&gt;推动地方政策与国家政策的对接，形成合力。&lt;/p&gt;
&lt;p&gt;管理机制&lt;/p&gt;
&lt;p&gt;建立健全网络维护和管理机制，确保网络运行的稳定性。&lt;/p&gt;
&lt;p&gt;加强人才培训，提升运维水平。&lt;/p&gt;
&lt;p&gt;四、实施步骤&lt;/p&gt;
&lt;p&gt;调研分析：深入调研县乡地区网络现状及需求，形成详细报告。&lt;/p&gt;
&lt;p&gt;方案设计：基于调研结果，制定具体实施方案。&lt;/p&gt;
&lt;p&gt;试点推进：选择典型区域进行试点，积累经验。&lt;/p&gt;
&lt;p&gt;全面推广：总结试点经验，逐步推广至全县乡范围。&lt;/p&gt;
&lt;p&gt;五、保障措施&lt;/p&gt;
&lt;p&gt;组织保障：成立专项工作组，明确责任分工。&lt;/p&gt;
&lt;p&gt;资金保障：多渠道筹措资金，确保项目顺利实施。&lt;/p&gt;
&lt;p&gt;监督评估：建立监督评估机制，定期检查项目进展。&lt;/p&gt;
&lt;p&gt;六、结语&lt;/p&gt;
&lt;p&gt;县乡本地传输网的发展是推动乡村振兴和数字化转型的重要基础。通过科学规划、技术创新和政策支持，努力构建一个高效、经济、可持续的县乡传输网络，为实现“网络强国”目标贡献力量。&lt;/p&gt;
&lt;p&gt;相关信息未在知识库中找到&lt;/p&gt;
&lt;h2 id="结语从建力到用智通信人的-ai-新使命"&gt;结语：从“建力”到“用智”，通信人的 AI 新使命
&lt;/h2&gt;&lt;p&gt;在上一篇文章的结尾，我们提到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“在下一篇中，我将分享如何利用开源工具，在本地环境中一步步搭建起这套能解码战略的智能系统。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今天，我们兑现了这个承诺。&lt;/p&gt;
&lt;p&gt;这套系统原型，还不能真正的实用,仅仅是一个最小的简单RAG系统 ， 但让我们认识到：人工智能，不再遥远，而是每一位战略规划专家都 &lt;strong&gt;用得上、用得起、用得安心&lt;/strong&gt; 的生产力工具。&lt;/p&gt;
&lt;p&gt;它让我们：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;• 从 “信息搬运工” 转变为 “战略架构师” ；&lt;/li&gt;
&lt;li&gt;• 从 “被动响应” 升级为 “主动洞察” ；&lt;/li&gt;
&lt;li&gt;• 从 “经验驱动” 迈向 “数据+ 智能驱动” 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更重要的是，它提醒我们：
作为通信人，我们不仅是 &lt;strong&gt;算力的建设者&lt;/strong&gt; ，更应成为 &lt;strong&gt;智能的应用者&lt;/strong&gt; 。
国家推动“人工智能+”，不仅是让我们建更多的数据中心，更是鼓励我们 &lt;strong&gt;率先在自身业务中实践 AI 的价值&lt;/strong&gt; 。&lt;/p&gt;
&lt;h2 id="-配套资源"&gt;📎 配套资源
&lt;/h2&gt;&lt;p&gt;关注公众号，回复“ &lt;strong&gt;第二大脑&lt;/strong&gt; ”（不是文章留言!），获取：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;• &lt;strong&gt;本文对应的工作流 JSON 文件（可直接导入）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;5 份示例资料（.txt）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;示例资料默认存储在&amp;quot;D:\second_brain_demo&amp;quot; 目录下&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;• &lt;strong&gt;由于笔记本算力不足, 语言模型用阿里的免费 Qwen 模型，可以去申请免费 API_KEY&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>色子肖像--Python程序</title><link>https://blog.fallleaf.net/p/tech-dice-portrait-python/</link><pubDate>Thu, 28 Dec 2017 15:49:14 +0800</pubDate><guid>https://blog.fallleaf.net/p/tech-dice-portrait-python/</guid><description>&lt;p&gt;上一篇色子肖像介绍了把图像变成色子点阵图的基本思路，用python语言采用PIL库写了一个程序，后来发现opencv更加简便合适，就采用numpy以及opencv库，进行了优化。
这是我第一次开始用python语言编写稍微复杂些的程序。对于有一定编程经验的人，采用实现一个功能的方式编程能够很快熟悉该语言，是一种很好的学习方式。&lt;/p&gt;
&lt;p&gt;以下是我编写的程序以及简单的注释。&lt;/p&gt;
&lt;p&gt;由于要对图像进行数值处理，所以采用opencv以及numpy库。首先是加载库，datetime是用于计算程序运行时间，os是用于获得文件路径，sys是用于获得命令行参数，cv2是opencv库，numpy是python的数组库。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import datetime
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import os
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import sys
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import cv2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;import numpy as np
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;保证程序本身直接执行，而不是被调用，如果直接执行，则调用main()函数。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if __name__ == &amp;#34;__main__&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; main()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;一个python文件就可以看作是一个python的模块，这个python模块（.py文件）有两种使用方式：直接运行使用和作为模块被其他模块调用。 每一个模块都有一个内置属性__name__。而__name__的值取决与python模块（.py文件）的使用方式。如果是直接运行使用，那么这个模块的__name__值就是“main”；如果是作为模块被其他模块调用，那么这个模块（.py文件）的__name__值就是该模块（.py文件）的文件名且不带路径和文件扩展名，如果dice_portrait_cv.py被其他python程序import dice_portrait_cv，则__name__为dice_portrait_cv。 main()函数，主要功能流程的执行，分别是：&lt;/p&gt;
&lt;p&gt;1.初始化文件路径&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def main():
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; start_time = datetime.datetime.now() #设置程序运行开始时间
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #初始化文件路径
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; EXEC_PATH = os.getcwd()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DICEPATH = EXEC_PATH + &amp;#39;\\dice_image\\&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OUTPUTPATH = EXEC_PATH + &amp;#39;\\output\\&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if not (os.path.exists(OUTPUTPATH)):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; os.mkdir(OUTPUTPATH)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2.获得命令行参数，调用自定义函数getvalue()，返回输入图片文件名，色子列数，是否旋转&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; imagefile, DICE_WIDTH, ROTATE = getvalue()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;3.读取要渲染的图片及色子图片&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; im = cv2.imread(imagefile, 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice = getDice(DICEPATH)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;4.调用自定义函数，调整图片大小，返回图片数组&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; im = AjustImage(DICE_WIDTH, im)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;5.定义灰色度数值对应色子1-6点的分组，用了list，也可以用numpy的数组&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p = [60, 80, 110, 150, 190, 220]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #使用numpy数组
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p = np.array([60, 80, 110, 150, 190, 220])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;6.对图像进行16x16图块分割，并计算灰度，对应色子1-6，并将图片转换成色子点阵图，调用自定义函数，获得处理后的图像以及色子点数文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; im, dice_data = calculateDice(im, imagefile, p, dice, ROTATE)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;7.保存图片及色子点数文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; write_Dice(im, OUTPUTPATH, imagefile, dice_data)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;8.打印运行时间以及色子图片，按任意键退出&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; end_time = datetime.datetime.now()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#39;程序运行时间:&amp;#39;, end_time - start_time,&amp;#39;秒&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cv2.imshow(imagefile, im)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cv2.waitKey(0)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;下面是自定义函数。 1.获得命令行变量，返回变量：imagefile（输入文件名）, DICE_WIDTH（色子列数）, ROTATE（色子2，3，6是否旋转） def getvalue():&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (len(sys.argv) &amp;lt; 2 or len(sys.argv) &amp;gt; 4):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Error, invalid arguments!&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Call with &amp;#34; + sys.argv[0] + &amp;#34; inputimage [tile-size] &amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sys.exit(1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ROTATE = False
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DICE_WIDTH = 50
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if len(sys.argv) == 2:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; imagefile = sys.argv[1]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; elif len(sys.argv) == 3:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; imagefile = sys.argv[1]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DICE_WIDTH = int(sys.argv[2])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (DICE_WIDTH &amp;gt; 150 or DICE_WIDTH &amp;lt; 30):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;色子列数不正确，应在30-150之间&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sys.exit(1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; imagefile = sys.argv[1]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DICE_WIDTH = int(sys.argv[2])
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (DICE_WIDTH &amp;gt; 150 or DICE_WIDTH &amp;lt; 30):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;Dice quality not avialiabe. It betweet 30 and 150&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sys.exit(1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (sys.argv[3] == &amp;#39;0&amp;#39; or sys.argv[3] == &amp;#39;1&amp;#39;):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ROTATE = bool(int(sys.argv[3]))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;1:色子旋转, 0:色子不旋转&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sys.exit(1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return imagefile, DICE_WIDTH, ROTATE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2.调整图片，图片宽度为色子列数*16，返回调整后的图像数组，自定义函数输入变量为DICE_WIDTH（色子列数），image（输入的图像数组）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def AjustImage(DICE_WIDTH, image): # 调整图片
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hight, width = image.shape[:2]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ratio = DICE_WIDTH * 16 / width
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; width = int(width * ratio)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hight = int(hight * ratio)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image = cv2.resize(image, (width, hight))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return image
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;3.读入色子图形&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def getDice(DICEPATH): # 读入色子图形文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice = np.zeros((9, 16, 16),dtype=&amp;#39;u8&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for i in range(9):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice[i] = cv2.imread(&amp;#39;./dice_image/&amp;#39; + str(i + 1) + &amp;#39;w.png&amp;#39;, 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return dice
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;4.对图像进行处理，输入参数：im（图像数组）, imagefile（图片文件名）, p（灰色度分组数组）, dice（色子图片数组）, ROTATE（色子2，3，6是否旋转），返回处理后的图片数组im，以及色子点数数组image_data&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def calculateDice(im, imagefile, p, dice, ROTATE): # 处理图片
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; x_max = int((im.shape[1]/16))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; y_max = int((im.shape[0]/16))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice_data = np.arange(y_max * x_max, dtype=&amp;#34;u8&amp;#34;).reshape(y_max, x_max)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice2_rotate = False
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice3_rotate = False
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice6_rotate = False
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cv2.namedWindow(imagefile, 0)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cv2.resizeWindow(imagefile, 640, int(640 * y_max / x_max))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for j in range(y_max):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for i in range(x_max):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 获得16x16图片的色度平均值mean或中位数median
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image_data = int(np.mean(im[j * 16:(j + 1) * 16, i * 16:(i + 1) * 16]))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 根据色度值确定色子点数
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (image_data &amp;lt; p[0]):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (ROTATE):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice6_rotate = not (dice6_rotate)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (dice6_rotate):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; elif (image_data &amp;gt;= p[0]) and (image_data &amp;lt; p[1]):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; elif (image_data &amp;gt;= p[1]) and (image_data &amp;lt; p[2]):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; elif (image_data &amp;gt;= p[2]) and (image_data &amp;lt; p[3]):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (ROTATE):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice3_rotate = not (dice3_rotate)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (dice3_rotate):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 7
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; elif (image_data &amp;gt;= p[3]) and (image_data &amp;lt; p[4]):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (ROTATE):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice2_rotate = not (dice2_rotate)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; if (dice2_rotate):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; else:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; n = 0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #将色子图片写入原图片
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; im[j * 16:(j + 1) * 16, i * 16:(i + 1) * 16] = dice[n]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dice_data[j, i] = n + 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #显示色子覆盖原图片步骤
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cv2.imshow(imagefile, im)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cv2.waitKey(1)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return im, dice_data
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;5.保存图片及色子点数文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;def write_Dice(im, OUTPUTPATH, imagefile, dice_data): # 将色子点数写入文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; y_max, x_max = np.shape(dice_data)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; DICE_WIDTH = x_max
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#34;色子数量&amp;#34;, y_max, &amp;#39;*&amp;#39;, x_max, &amp;#39;=&amp;#39;, x_max * y_max)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cv2.imwrite(OUTPUTPATH + str(DICE_WIDTH) + &amp;#39;_hist_&amp;#39; + imagefile, im)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f = open(OUTPUTPATH + str(DICE_WIDTH) + &amp;#39;_hist_&amp;#39; + imagefile + &amp;#39;.txt&amp;#39;, &amp;#39;wt&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for y in range(y_max):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f.write((str(y + 1) + &amp;#39;:&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; for x in range(x_max):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f.write(str(dice_data[y, x]) + &amp;#39;,&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f.write(&amp;#39;\n&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f.close()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print(&amp;#39;文件保存完毕!&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;采用numpy，对数组进行运算非常方便。&lt;/p&gt;
&lt;p&gt;程序放到了GitHub上，也可以直接用&lt;/p&gt;
&lt;p&gt;git clone &lt;a class="link" href="https://github.com/fallleaf/dice_portrait.git" target="_blank" rel="noopener"
&gt;https://github.com/fallleaf/dice_portrait.git&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;图框和色子都准备好了，这将是18年的第一个项目。&lt;/p&gt;</description></item><item><title>色子肖像</title><link>https://blog.fallleaf.net/p/tech-dice-portrait/</link><pubDate>Tue, 12 Dec 2017 10:02:27 +0800</pubDate><guid>https://blog.fallleaf.net/p/tech-dice-portrait/</guid><description>&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_small.png" alt="Featured image of post 色子肖像" /&gt;&lt;p&gt;2008年Scott MacDonald发表了一篇Blog，用骰子为她制作一副肖像画,他把一幅肖像画量化成不同点数的色子，用色子摆放成了一幅肖像画。如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/caroline_portrait.png"
width="512"
height="273"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/caroline_portrait_hu_c2c495ea3cda6d25.png 480w, https://blog.fallleaf.net/p/tech-dice-portrait/caroline_portrait_hu_f70e9b7b7c26cbf2.png 1024w"
loading="lazy"
alt="caroline_portrait"
class="gallery-image"
data-flex-grow="187"
data-flex-basis="450px"
&gt;&lt;/p&gt;
&lt;p&gt;他用了2560（40x60）个16mm的色子，制作了一个64cmx96cm的色子肖像，如下图：&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/caroline.jpg"
width="529"
height="542"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/caroline_hu_fbdcc507a223342c.jpg 480w, https://blog.fallleaf.net/p/tech-dice-portrait/caroline_hu_4ade5e8f384b2656.jpg 1024w"
loading="lazy"
alt="caroline"
class="gallery-image"
data-flex-grow="97"
data-flex-basis="234px"
&gt;&lt;/p&gt;
&lt;p&gt;他用的是Prossing语言编写的程序。近期正在学习Python，就尝试用Python来实现这一功能。&lt;/p&gt;
&lt;p&gt;思路是先对图像进行灰度处理，然后把图片分割成16x16像素的单元图块，再对图块中256个点的灰度取平均值，对平均值分组用1-6数值代替。色度值范围0-255，亮度从深到浅，颜色从黑到白。数值1-6对应色子的点数，对于黑底白点的色子，色度值和点数正比例关系，对于白底黑点的色子，色度值和点数反比例关系。最后按色子点数做出图。&lt;/p&gt;
&lt;p&gt;我用了三种16x16的图块，如下：&lt;/p&gt;
&lt;p&gt;灰度色块：
&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/graydice.png"
width="96"
height="16"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/graydice_hu_2a8cd17567e55e06.png 480w, https://blog.fallleaf.net/p/tech-dice-portrait/graydice_hu_9af2030d95ba904e.png 1024w"
loading="lazy"
alt="graydice"
class="gallery-image"
data-flex-grow="600"
data-flex-basis="1440px"
&gt;&lt;/p&gt;
&lt;p&gt;黑底白点色子：
&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/blackdice.png"
width="96"
height="16"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/blackdice_hu_1630946f4df10da0.png 480w, https://blog.fallleaf.net/p/tech-dice-portrait/blackdice_hu_126e36a88e9ee30.png 1024w"
loading="lazy"
alt="blackdice"
class="gallery-image"
data-flex-grow="600"
data-flex-basis="1440px"
&gt;&lt;/p&gt;
&lt;p&gt;白底黑点色子：
&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/whitedice.png"
width="96"
height="16"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/whitedice_hu_6797ae34ca853fb0.png 480w, https://blog.fallleaf.net/p/tech-dice-portrait/whitedice_hu_a220206ef32465ae.png 1024w"
loading="lazy"
alt="whitedice"
class="gallery-image"
data-flex-grow="600"
data-flex-basis="1440px"
&gt;&lt;/p&gt;
&lt;p&gt;利用Python的PIL库（Python Image Library）以及numpy数组库，能够很容易的完成功能。&lt;/p&gt;
&lt;p&gt;首先是加载库文件，打开图片，对图片灰度处理，并计算要分割图块的数量&lt;/p&gt;
&lt;p&gt;#加载库文件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;from PIL import Image, ImageDraw
import numpy as np
#载入色子图片，1.png-6.png，代表色子点数
dice =[]
for i in range(6):
dice.append(Image.open(str(i+1)+&amp;rsquo;.png&amp;rsquo;))
#载入肖像图片
im = Image.open(&amp;ldquo;cecilia.png&amp;rdquo;)
im=im.convert(&amp;ldquo;L&amp;rdquo;)
width,hight =im.size
x_max = int (width/16)
y_max = int(hight/16)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;分割图片为16x16图块，并计算点的色度平均值&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;image_data = np.ones(y_max&lt;em&gt;x_max).reshape(y_max,x_max)
block_data = np.ones(16&lt;/em&gt;16).reshape(16,16)
dice_data = np.ones(y_max&lt;em&gt;x_max).reshape(y_max,x_max)
for j in range(y_max):
for i in range(x_max):
b=im.crop( (i&lt;/em&gt;16,j*16,(i+1)*16,(j+1)*16))#获得16x16图片
sum_x=0
for ii in range(16):
for jj in range(16):
block_data[jj,ii]=b.getpixel((ii,jj))
image_data[j,i]=int(np.mean(block_data))&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;根据色块的平均值分配色子图块：&lt;/p&gt;
&lt;p&gt;#定义色度分组值&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;p = [45,65,80,95,130,155]
if (image_data[j,i]&amp;lt;p[0]):
n = 5
elif (image_data[j,i]&amp;gt;=p[0]) and (image_data[j,i]&amp;lt;p[1]):
n = 4
elif (image_data[j,i]&amp;gt;=p[1]) and (image_data[j,i]&amp;lt;p[2]):
n = 3
elif (image_data[j,i]&amp;gt;=p[2]) and (image_data[j,i]&amp;lt;p[3]):
n = 2
elif(image_data[j,i]&amp;gt;=p[3]) and (image_data[j,i]&amp;lt;p[4]):
n = 1
else:
n = 0
im.paste(dice[n],(i&lt;em&gt;16,j&lt;/em&gt;16))
dice_data[j,i] = n+1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里p1p6是对0255的色度值划分到1-6的分组值。 生成处理后的图片，及显示图片&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;im.save(&amp;lsquo;small_ceciliaw.png&amp;rsquo;)
im.show()&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;将色子点数写入文件&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;f = open(&amp;lsquo;cecilia_dice_data.txt&amp;rsquo;,&amp;lsquo;wt&amp;rsquo;)
for y in range(y_max):
f.write((str(y+1)+&amp;rsquo;:&amp;rsquo;))
for x in range(x_max):
f.write(str(dice_data[y,x])+&amp;rsquo;,&amp;rsquo;)
f.write(&amp;rsquo;\n&amp;rsquo;)
f.close()&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;按以上方法生成了三种处理后的图片，第一个是原图，第二个是灰度色块，第三个是黑底白点，第四个是白底黑点。如下图：
&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_small.png"
width="1120"
height="1584"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_small_hu_542dd8651340c7dd.png 480w, https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_small_hu_e475395d559590d0.png 1024w"
loading="lazy"
alt="cecilia"
class="gallery-image"
data-flex-grow="70"
data-flex-basis="169px"
&gt;&lt;/p&gt;
&lt;p&gt;所用原始图片的大小为1120x1584，一共生成色子数量为70x99=6930块,若用8mm的色子制作，大小为56cmx79.2cm。 亚洲人的面部没有欧洲人立体感强，选择照片时需挑选立体感强，色差比较鲜明的图片，这样，分辨率可以低一些，色子的数量可以减少一些。另外，1-6的分组值也需要进一步优化。下图是分辨率变化的情况。
&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/ceciliag_gif.gif"
width="280"
height="396"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/ceciliag_gif_hu_5e4c2dfb41ced0d2.gif 480w, https://blog.fallleaf.net/p/tech-dice-portrait/ceciliag_gif_hu_8bfeb71e387b1d48.gif 1024w"
loading="lazy"
alt="ceciliag"
class="gallery-image"
data-flex-grow="70"
data-flex-basis="169px"
&gt;
&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/ceciliaw_gif.gif"
width="280"
height="396"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/ceciliaw_gif_hu_b692e8d90f563c54.gif 480w, https://blog.fallleaf.net/p/tech-dice-portrait/ceciliaw_gif_hu_85051bd5a762ed50.gif 1024w"
loading="lazy"
alt="ceciliaw"
class="gallery-image"
data-flex-grow="70"
data-flex-basis="169px"
&gt;
&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/ceciliab_gif.gif"
width="280"
height="396"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/ceciliab_gif_hu_2bf96734fa72f743.gif 480w, https://blog.fallleaf.net/p/tech-dice-portrait/ceciliab_gif_hu_d881b7438a7385eb.gif 1024w"
loading="lazy"
alt="ceciliab"
class="gallery-image"
data-flex-grow="70"
data-flex-basis="169px"
&gt;&lt;/p&gt;
&lt;p&gt;这个项目正在进行中，等色子及图框到后再把制作的全过程展示一下。&lt;/p&gt;
&lt;p&gt;续：&lt;/p&gt;
&lt;p&gt;购买了2000个色子，用纸盒盖子做框，摆成一个肖像，远看效果好些&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_dice1.jpg"
width="1080"
height="1440"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_dice1_hu_9afffa2e6bcab57.jpg 480w, https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_dice1_hu_79421af38ba3cd23.jpg 1024w"
loading="lazy"
alt="cecilia1"
class="gallery-image"
data-flex-grow="75"
data-flex-basis="180px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_dice2.jpg"
width="1080"
height="1440"
srcset="https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_dice2_hu_3f405b5235b9b71e.jpg 480w, https://blog.fallleaf.net/p/tech-dice-portrait/cecilia_dice2_hu_49d2120084624dfc.jpg 1024w"
loading="lazy"
alt="cecilia2"
class="gallery-image"
data-flex-grow="75"
data-flex-basis="180px"
&gt;&lt;/p&gt;
&lt;p&gt;源代码放到了GitHub上，做了些改动，采用opencv做图像处理。&lt;/p&gt;</description></item></channel></rss>