<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>首页 on lnk-k 的博客</title><link>https://lnk-k.github.io/</link><description>Recent content in 首页 on lnk-k 的博客</description><generator>Hugo</generator><language>zh-cn</language><copyright>© lnk-k</copyright><lastBuildDate>Thu, 28 May 2026 20:11:04 +0800</lastBuildDate><atom:link href="https://lnk-k.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Rename</title><link>https://lnk-k.github.io/posts/rename/</link><pubDate>Thu, 28 May 2026 20:11:04 +0800</pubDate><guid>https://lnk-k.github.io/posts/rename/</guid><description>&lt;h1 id="如何处理乱码dicom文件夹">如何处理乱码DICOM文件夹&lt;/h1>
&lt;hr>
&lt;h1 id="0-背景">0. 背景&lt;/h1>
&lt;p>其实本来没想做这个的，只是发现每次去找series_number的时候，我都要一个一个用ITK打开dicom文件，笔者属实是懒于应付这种重复机械的工作，所以写了个批量重命名的脚本&lt;del>虽然是生成的并且实际上花费的时间早就够我一个一个点进去看了&lt;/del>。&lt;/p>
&lt;p>每一个乱码文件夹里面可能是一组DICOM序列，比如 CT 的某个扫描序列、localizer 定位像、增强期图像等。问题就是这些文件夹名称没有任何意义，所以写了个python脚本用来批量读取每个DICOM序列的header信息，并且根据series_number和series_description自动重命名文件夹。&lt;/p>
&lt;p>完整代码见 Github:&lt;a href="https://github.com/lnk-k/allocate-dicom-renamer">allocate-dicom-renamer&lt;/a>&lt;/p>
&lt;hr>
&lt;h1 id="1-脚本目标">1. 脚本目标&lt;/h1>
&lt;p>这个脚本主要完成三件事：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>批量遍历所有病例文件夹；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>读取每个 DICOM 序列的 header 信息；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>根据 &lt;code>SeriesNumber&lt;/code> 和是否为 &lt;code>localizer&lt;/code> 自动重命名文件夹。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>最终效果类似：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">乱码文件夹1 -&amp;gt; series001
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">乱码文件夹2 -&amp;gt; series002
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">乱码文件夹3 -&amp;gt; localizer003
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="2-用到的库">2. 用到的库&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">json&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">pydicom&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">SimpleITK&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">sitk&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;code>os&lt;/code>：遍历文件夹、重命名文件夹；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>json&lt;/code>：保存重命名日志；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>pydicom&lt;/code>：读取 DICOM header；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>SimpleITK&lt;/code>：作为备用方式读取 DICOM 信息。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>安装依赖：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pip install pydicom SimpleITK
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h1 id="3-主要参数">3. 主要参数&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DATA_DIR&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;/你的/data/路径&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DRY_RUN&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">False&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">MIN_SERIES_IMAGES&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="data_dir">DATA_DIR&lt;/h2>
&lt;p>表示数据总目录，下面应该是多个病例文件夹。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">data/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── case1/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── case2/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── case3/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="dry_run">DRY_RUN&lt;/h2>
&lt;p>这是一个安全开关。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">DRY_RUN&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">True&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>表示只预览，不真正改名。&lt;/p></description></item><item><title>How_to_registrate</title><link>https://lnk-k.github.io/posts/how_to_registrate/</link><pubDate>Tue, 26 May 2026 16:24:58 +0800</pubDate><guid>https://lnk-k.github.io/posts/how_to_registrate/</guid><description>&lt;h1 id="如何具体实现registration">如何具体实现registration&lt;/h1>
&lt;hr>
&lt;h1 id="0-心得">0. 心得&lt;/h1>
&lt;p>一开始其实根本没理解配准是具体需要做什么，只是一味的vibe coding，什么重采样，刚性配准什么的，最后生成出来的图像全是噪声，第二周感觉把这些放一起就没问题了，结果惊奇的发现人体直接错位了，锁骨来到了人体的中间地方，经过重新认真严谨思考，才意识到配准的真正含义，接下来是对具体配准过程的学习笔记。&lt;/p>
&lt;p>完整代码见 GitHub：&lt;a href="https://github.com/lnk-k/medical-image-registration-scripts">registration-scripts&lt;/a>&lt;/p>
&lt;hr>
&lt;h1 id="1-任务目标">1. 任务目标&lt;/h1>
&lt;p>当前任务是多期相 CT 图像配准。&lt;/p>
&lt;p>对于同一个病例，可能存在多个期相或序列，例如：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>平扫期&lt;/p>
&lt;/li>
&lt;li>
&lt;p>动脉期&lt;/p>
&lt;/li>
&lt;li>
&lt;p>门静脉期&lt;/p>
&lt;/li>
&lt;li>
&lt;p>延迟期&lt;/p>
&lt;/li>
&lt;li>
&lt;p>std5mm&lt;/p>
&lt;/li>
&lt;li>
&lt;p>lung5mm&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>这些序列的原始 DICOM 可能存在：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>切片数量不同&lt;/p>
&lt;/li>
&lt;li>
&lt;p>扫描起始位置不同&lt;/p>
&lt;/li>
&lt;li>
&lt;p>spacing 不同&lt;/p>
&lt;/li>
&lt;li>
&lt;p>origin 不同&lt;/p>
&lt;/li>
&lt;li>
&lt;p>扫描范围不同&lt;/p>
&lt;/li>
&lt;li>
&lt;p>呼吸状态导致器官位置轻微变化&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>因此，不能直接认为不同期相中相同编号的 DICOM 切片对应同一个身体位置。&lt;/p>
&lt;p>当前目标是：&lt;/p>
&lt;p>以一个期相作为 fixed image，将其他期相作为 moving image，通过配准和重采样，使不同期相在统一空间中具有一一对应的切片关系。&lt;/p>
&lt;p>最终输出为 nnU-Net 多通道输入格式。&lt;/p>
&lt;hr>
&lt;h1 id="2-大体流程">2. 大体流程&lt;/h1>
&lt;p>当前采用的整体流程为：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>读取同一病例下的 DICOM 文件；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>根据 SeriesInstanceUID 区分不同序列；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>排除 localizer、scout、切片数过少、不同部位的序列；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>选择一个序列作为 fixed image；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>其他序列作为 moving image；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>对 moving image 进行配准；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>将 moving image 重采样到 fixed image 的空间；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>根据共同有效扫描范围进行统一裁剪；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>检查同编号切片是否对应同一部位；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>保存为 nnU-Net 多通道 NIfTI 格式。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>简化表示为：&lt;/p>
&lt;p>fixed image&lt;/p>
&lt;p>↓&lt;/p>
&lt;p>提供统一空间标准&lt;/p>
&lt;p>moving image&lt;/p>
&lt;p>↓&lt;/p>
&lt;p>配准到 fixed image&lt;/p>
&lt;p>↓&lt;/p>
&lt;p>重采样到 fixed image 空间&lt;/p></description></item><item><title>Registration</title><link>https://lnk-k.github.io/posts/registration/</link><pubDate>Mon, 25 May 2026 15:34:27 +0800</pubDate><guid>https://lnk-k.github.io/posts/registration/</guid><description>&lt;h1 id="医学图像配准学习笔记">医学图像配准学习笔记&lt;/h1>
&lt;p>这周继续研究期相配准。。&lt;/p>
&lt;h2 id="1图像配准定义">1.图像配准定义&lt;/h2>
&lt;p>根据笔者粗浅的理解，配准就是通过空间变换将 moving image 变换到fixed image上，使两个图像上中的公共点一一对应。&lt;/p>
&lt;p>目前我的任务就是将同一个病例中不同 DICOM 序列的图像统一到同一个空间坐标系中，使它们具有一致的：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>spacing：体素间距&lt;/p>
&lt;/li>
&lt;li>
&lt;p>origin：原点坐标&lt;/p>
&lt;/li>
&lt;li>
&lt;p>direction：方向矩阵&lt;/p>
&lt;/li>
&lt;li>
&lt;p>size：图像尺寸&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>最终目标是让不同序列可以作为 nnU-Net 的多通道输入，因为这些通道必须在空间上对应，否则模型学到的多序列信息就会错位。&lt;/p>
&lt;hr>
&lt;h2 id="2图像配准应用场景">2.图像配准应用场景&lt;/h2>
&lt;p>这一部分就不必多言，因为笔者本身做的项目也就只和图像识别有关。&lt;/p>
&lt;hr>
&lt;h2 id="3-当前任务的配准类型定位">3. 当前任务的配准类型定位&lt;/h2>
&lt;p>虽然图像配准有很多分类方式，例如按模态、对象、变换类型等分类，但对当前任务来说，不需要展开全部分类。&lt;/p>
&lt;p>当前任务已经比较明确：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>应用领域：医学图像配准&lt;/p>
&lt;/li>
&lt;li>
&lt;p>图像类型：CT 图像&lt;/p>
&lt;/li>
&lt;li>
&lt;p>配准对象：同一病例内部不同期相&lt;/p>
&lt;/li>
&lt;li>
&lt;p>配准类型：多期相 CT 配准&lt;/p>
&lt;/li>
&lt;li>
&lt;p>图像维度：3D 到 3D 配准&lt;/p>
&lt;/li>
&lt;li>
&lt;p>目标用途：统一不同期相图像空间，使其适配 nnU-Net 多通道输入&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>因此，当前任务可以概括为：&lt;/p>
&lt;blockquote>
&lt;p>同一病例多期相 CT 图像之间的 3D 医学图像配准。&lt;/p>&lt;/blockquote>
&lt;p>在这个任务中，重点不是讨论各种配准分类，而是解决以下问题：&lt;/p>
&lt;ol>
&lt;li>
&lt;p>如何选择 fixed image 和 moving image；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如何让不同期相的图像在空间上对齐；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如何保证配准后同编号切片对应同一解剖位置；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如何处理不同期相扫描范围不一致的问题；&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如何将处理结果转换为 nnU-Net 可用的多通道输入格式。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>从方法选择上看，当前任务主要关注：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>重采样 Resampling&lt;/p>
&lt;/li>
&lt;li>
&lt;p>刚性配准 Rigid Registration&lt;/p>
&lt;/li>
&lt;li>
&lt;p>仿射配准 Affine Registration&lt;/p>
&lt;/li>
&lt;li>
&lt;p>必要时考虑非刚性配准 Deformable Registration&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>其中，当前阶段优先考虑：&lt;/p>
&lt;blockquote>
&lt;p>刚性配准 + 重采样 + 共同有效区域裁剪&lt;/p>&lt;/blockquote>
&lt;p>原因是刚性配准可以校正不同期相之间的整体平移和旋转，同时不会改变器官和病灶的真实形态。对于医学图像分割前处理来说，这种方法相对稳定、安全，也更适合作为批量化处理流程的基础。&lt;/p>
&lt;p>如果刚性配准后仍然存在整体尺度差异，可以进一步尝试仿射配准；如果存在明显局部形变，再谨慎考虑非刚性配准。&lt;/p>
&lt;hr>
&lt;h2 id="4图像配准过程">4.图像配准过程&lt;/h2>
&lt;h3 id="41-配准中的核心概念">4.1 配准中的核心概念&lt;/h3>
&lt;h4 id="411-fixed-image">4.1.1 Fixed Image&lt;/h4>
&lt;p>&lt;code>fixed image&lt;/code> 是基准图像，提供统一的空间标准，包括：&lt;/p>
&lt;ul>
&lt;li>
&lt;p>spacing&lt;/p>
&lt;/li>
&lt;li>
&lt;p>origin&lt;/p></description></item><item><title>第一篇博客</title><link>https://lnk-k.github.io/posts/welcome/</link><pubDate>Sat, 16 May 2026 00:00:00 +0800</pubDate><guid>https://lnk-k.github.io/posts/welcome/</guid><description>&lt;p>这是博客的第一篇文章。&lt;/p>
&lt;p>现在这个仓库已经变成 Hugo 项目：以后你只需要在 &lt;code>content/posts/&lt;/code> 目录里新增 Markdown 文件，推送到 GitHub 后，GitHub Actions 会自动构建并发布到 GitHub Pages。&lt;/p>
&lt;p>本地新建文章可以运行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo new content/posts/my-new-post.md
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>本地预览可以运行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后打开 &lt;code>http://localhost:1313/&lt;/code>。&lt;/p>
&lt;p>题外话：&lt;/p>
&lt;p>哎也真是一种感慨吧，好像就是去年的这个时间点，看到高中同学做了个个人网站，一时心血来潮也想整一个，但是由于笔者的技术属实过于低下，搞了半天也只弄了个半成品，当时记得连个git都整了半天，想尽一切办法，不过也忘了最后是怎么弄的。记得那个时候还是o4mini？不过现在在gpt的辅佐下估计制作这个个人网页应该问题也不大。&lt;/p>
&lt;p>确实感慨，去年这个时候还在努力打oi&lt;del>也只是假努力&lt;/del>，每周还坚持打cf和atcoder，不过现在和这些东西也越来越远了，虽然说自己也不知道接下来的路该往哪里走，但日子总得一天一天过吧，to be postive。&lt;/p></description></item><item><title>关于</title><link>https://lnk-k.github.io/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lnk-k.github.io/about/</guid><description>&lt;p>你好，我是 lnk-k。&lt;/p>
&lt;p>一个来自东北大学24级电子信息工程专业&lt;del>虽然对电学一窍不通&lt;/del>的本科生，有过一定的算法竞赛经验&lt;del>虽然连小学生也比不过&lt;/del>，最擅长使用面向gpt编程。&lt;/p>
&lt;p>未来可能还是要走ai方向，不过很多细节和方向暂时都还没想好，目前正在做关于医学图像识别的工作，之前也没做过其他项目，这个个人网站的主要目的就是想找个地方碎碎念(不是)，顺便记录一些学习过程，欢迎佬来多多指导我&lt;del>多带带我吧&lt;/del>&lt;/p>
&lt;p>也可以带我打cs。。&lt;/p>
&lt;p>GitHub：&lt;a href="https://github.com/lnk-k">https://github.com/lnk-k&lt;/a>&lt;/p></description></item><item><title>归档</title><link>https://lnk-k.github.io/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://lnk-k.github.io/archives/</guid><description/></item></channel></rss>