<p>我至少要和强度比较一下<code>i=R+G+B</code>。。。在</p>
<p>对于<strong>ROI</strong>类掩码,您可以使用任何阈值技术</strong>(自适应阈值化是最好的),但是如果您得到的图像不是<strong>ROI</strong>掩码,并且应该与原始图像的视觉特征相似,则我所知的最佳转换是使用<a href="https://stackoverflow.com/a/36820654/2521214">Dithering</a>。在</p>
<p>BW抖动背后的想法是将灰度转换成BW模式,以预先显示阴影。结果通常是嘈杂的,但保留了更多的视觉细节。这里简单的天真<强> C++ >强>抖动(对不起不是Python编码器):</P>
<pre class="lang-cpp prettyprint-override"><code>picture pic0,pic1;
// pic0 - source img
// pic1 - output img
int x,y,i;
color c;
// resize output to source image size clear with black
pic1=pic0; pic1.clear(0);
// dithering
i=0;
for (y=0;y<pic0.ys;y++)
for (x=0;x<pic0.xs;x++)
{
// get source pixel color (AARRGGBB)
c=pic0.p[y][x];
// add to leftovers
i+=WORD(c.db[picture::_r]); // _r,_g,_b are just constants 0,1,2
i+=WORD(c.db[picture::_g]);
i+=WORD(c.db[picture::_b]);
// threshold white intensity is 255+255+255=765
if (i>=384){ i-=765; c.dd=0x00FFFFFF; } else c.dd=0;
// copy to destination image
pic1.p[y][x]=c;
}
</code></pre>
<p>所以它和上面的链接是一样的,但是只使用黑白两种颜色。<code>i</code>是要放在图像上的累积强度。<code>xs,ys</code>是分辨率,<code>c.db[]</code>是颜色通道访问。在</p>
<p>如果我像这样在彩色图像上应用这个:</p>
<p><a href="https://i.stack.imgur.com/v4W1j.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/v4W1j.jpg" alt="input"/></a></p>
<p>结果如下:</p>
<p><a href="https://i.stack.imgur.com/8TH7y.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/8TH7y.png" alt="output"/></a></p>
<p>正如你所看到的所有细节都保留了下来,但是一个嘈杂的图案出现了。。。出于打印目的,有时会将图像的分辨率放大以提高质量。如果你用一个更好的模式(比如16x16平方等等)改变naive2nestedforloops,那么噪声将在其源限制伪影附近得到保存。还有一些方法使用伪随机模式(将剩余的<code>i</code>放在其源像素附近的随机位置),这是更好的。。。在</p>
<p>但是对于BW抖动,即使是幼稚的方法也足够了,因为伪影只有一个像素大小。对于彩色抖动,伪影可能会产生几个像素大小的不需要的水平线图案(取决于使用的调色板不匹配越差的调色板越大的伪影…)</p>
<p><strong>PS</strong>只是为了与其他应答阈值输出进行比较,这是同一张抖动图像:</p>
<p><a href="https://i.stack.imgur.com/IHhF8m.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/IHhF8m.jpg" alt="input"/></a>
<a href="https://i.stack.imgur.com/NSG59.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/NSG59.png" alt="output"/></a></p>