<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>图像处理 on 虫子樱桃</title>
    <link>https://czyt.eu.org/tags/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/</link>
    <description>Recent content in 图像处理 on 虫子樱桃</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <copyright>{year} 虫子樱桃</copyright>
    <lastBuildDate>Sat, 19 Sep 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://czyt.eu.org/tags/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>withoutBG 纯 Go 封装小记</title>
      <link>https://czyt.eu.org/post/withoutbg-pure-go/</link>
      <pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate>
      <guid>https://czyt.eu.org/post/withoutbg-pure-go/</guid>
      <description>&lt;p&gt;把 withoutBG 的开放权重模型包成了一个纯 Go 库：&lt;a href=&#34;https://github.com/lib-x/withoutbg-go&#34; class=&#34;prose-external&#34;&gt;github.com/lib-x/withoutbg-go&lt;span class=&#34;prose-external-mark&#34; aria-hidden=&#34;true&#34;&gt;&lt;/span&gt;&lt;/a&gt;
。和上一个 PP-OCRv6 的封装一样，用 &lt;a href=&#34;https://github.com/amikos-tech/pure-onnx&#34; class=&#34;prose-external&#34;&gt;pure-onnx&lt;span class=&#34;prose-external-mark&#34; aria-hidden=&#34;true&#34;&gt;&lt;/span&gt;&lt;/a&gt;
 通过 purego 调 ONNX Runtime，不需要 CGO，也不用装 PyTorch。&lt;/p&gt;
&lt;p&gt;这个模型做的是&lt;strong&gt;背景去除&lt;/strong&gt;：输入一张 RGB 照片，输出一张 alpha 蒙版，把蒙版挂到原图的 alpha 通道上就是抠图。模型仓库是 &lt;a href=&#34;https://huggingface.co/withoutbg/withoutbg-openweights-onnx&#34; class=&#34;prose-external&#34;&gt;withoutbg/withoutbg-openweights-onnx&lt;span class=&#34;prose-external-mark&#34; aria-hidden=&#34;true&#34;&gt;&lt;/span&gt;&lt;/a&gt;
，455MB，Apache-2.0。&lt;/p&gt;
&lt;p&gt;这篇记录的重点和上一篇不同：上次的第一手来源是模型自带的 &lt;code&gt;inference.yml&lt;/code&gt;，这次是模型自带的 &lt;strong&gt;sidecar JSON&lt;/strong&gt;；上次的难点是动态形状和字典映射，这次的难点是&lt;strong&gt;几何&lt;/strong&gt;（letterbox 怎么缩放、蒙版怎么裁回去），踩错一步人物边缘就会被啃掉一圈。&lt;/p&gt;
&lt;h2 id=&#34;先看术语抠图和它的度量&#34;&gt;先看术语：抠图和它的度量&lt;/h2&gt;
&lt;p&gt;没接触过图像处理也没关系，先看这几个词。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;抠图（matting）和分割（segmentation）不是一回事。&lt;/strong&gt; 分割给每个像素一个&amp;quot;是不是前景&amp;quot;的二值标签，抠图给的是 0 到 1 之间的连续值，叫 alpha 蒙版。连续值是为了处理半透明和边缘过渡：发丝、玻璃、烟雾这类区域，一个像素里可能一半是前景一半是背景，硬二值会切出锯齿。这个模型输出的就是连续 alpha。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;alpha 合成&lt;/strong&gt;，把抠图结果和任意背景拼起来用的公式：&lt;/p&gt;

  &lt;div class=&#34;katex-output&#34;&gt;
  $$
C = \alpha F + (1-\alpha) B
$$
&lt;/div&gt;


&lt;p&gt;$F$ 是前景色，$B$ 是新背景，$\alpha$ 是蒙版值。$\alpha=1$ 保留原像素，$\alpha=0$ 完全换成背景，中间值按比例混合。库里 &lt;code&gt;Remove()&lt;/code&gt; 返回的就是&amp;quot;原图颜色 + 新 alpha 通道&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;letterbox&lt;/strong&gt;：把任意比例的图塞进正方形输入框的标准做法，等比缩放让长边贴到目标尺寸，空出来的地方填固定颜色。和直接拉伸成正方形的区别是：拉伸会改变物体形状，模型会把形变当成内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NCHW&lt;/strong&gt;：张量内存布局，依次是批、通道、高、宽。这个模型的输入是 &lt;code&gt;[1, 3, 448, 448]&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
