我至少会比较强度i=R+G+B ...
对于 ROI 之类的蒙版,您可以使用任何阈值技术(自适应阈值是最好的),但如果您生成的图像不是 ROI掩码并且应该类似于原始图像的视觉特征,那么我所知道的最佳转换是使用Dithering。
BW 抖动背后的想法是将灰度转换为 BW 模式,从而保留阴影。结果通常很嘈杂,但保留了更多的视觉细节。这里简单的 C++ 抖动(抱歉不是 Python 编码器):
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;
}
所以它与上面的链接相同,但只使用黑白。 i 是要放置在图像上的累积强度。 xs,ys 是分辨率,c.db[] 是颜色通道访问。
如果我将它应用到这样的彩色图像上:
结果如下:
正如您所看到的,所有细节都保留了下来,但出现了嘈杂的图案……出于打印目的,有时图像的分辨率会成倍增加以提高质量。如果您使用更好的模式(如 16x16 正方形等)更改 naive 2 嵌套 for 循环,则噪声将在其源限制伪影附近保留。还有一些使用伪随机模式的方法(将剩余的i 放在其源像素附近的随机位置)甚至更好......
但是对于 BW 抖动,即使是简单的方法也足够了,因为伪像只有一个像素大小。对于彩色抖动,伪影可能会创建几个像素大小的不需要的水平线图案(取决于使用的调色板不匹配,越差的调色板越大……)
PS 只是为了与其他答案阈值输出进行比较,这是相同的抖动图像: