C#从图像中去除渐变背景
我将一幅图像加载到C#格式的位图中,带有我扫描的文档中的渐变背景。 一个例子可能如下图所示: 我在C#中的目标是去除背景,这样我就有了纯白的背景。现在我自己似乎找不到一个方法来做这件事。有没有办法在某种程度上实现这一点 提前谢谢C#从图像中去除渐变背景,c#,image-processing,bitmap,gradient,C#,Image Processing,Bitmap,Gradient,我将一幅图像加载到C#格式的位图中,带有我扫描的文档中的渐变背景。 一个例子可能如下图所示: 我在C#中的目标是去除背景,这样我就有了纯白的背景。现在我自己似乎找不到一个方法来做这件事。有没有办法在某种程度上实现这一点 提前谢谢 如果您知道渐变颜色(例如,只有部分RGB颜色会引起红色变化)或至少知道文本的颜色(例如,如果文本始终为黑色),则可以遍历图像的所有像素,然后: 使用GetPixel()获取像素颜色 检查是否为文本(黑色) 如果是,则移动到下一个像素 如果不是,则使用SetPixel()
如果您知道渐变颜色(例如,只有部分RGB颜色会引起红色变化)或至少知道文本的颜色(例如,如果文本始终为黑色),则可以遍历图像的所有像素,然后:
GetPixel()
获取像素颜色SetPixel()
将颜色更改为白色李>
对于梯度,它应该足够了。对于更复杂的背景,它需要更复杂的算法。这里有一个使用
锁位的版本
前提是,如果它不是黑色的,则将其更改为白色
GetPixel
和SetPixel
它使用指针处理内存中的原始数据
遍历每个像素
检查颜色并根据需要将其更改为白色
保存图像
注意:显然,这将破坏任何抗锯齿和平滑,对于某些图像类型和其他各种问题,它将失败
使用(var bmp=新位图(@“D:\Test.png”))
{
var data=bmp.LockBits(新矩形(0,0,bmp.Width,bmp.Height),ImageLockMode.ReadWrite,PixelFormat.Format32bppPArgb);
var white=Color.white.ToArgb();
var black=Color.black.ToArgb();
尝试
{
var length=(int*)data.Scan0+bmp.Height*bmp.Width;
对于(var p=(int*)data.Scan0;p
输出
我想你需要看看专门的图像处理库——我知道这是怎么回事,所以我一定要试试这个。但现在我也在想,这段代码是否可以转换为,例如,如果扫描文档中有一张照片,里面有多种颜色,而您不知道它们是什么颜色?@DLP只要颜色不是黑色就可以了,但是我认为您可以看到它是如何工作的,所以您应该能够根据其他需要修改它
using (var bmp = new Bitmap(@"D:\Test.png"))
{
var data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppPArgb);
var white = Color.White.ToArgb();
var black = Color.Black.ToArgb();
try
{
var length = (int*)data.Scan0 + bmp.Height * bmp.Width;
for (var p = (int*)data.Scan0; p < length; p++)
if (*p != black) *p = white;
}
finally
{
// unlock the bitmap
bmp.UnlockBits(data);
bmp.Save(@"D:\Output.Bmp", ImageFormat.Bmp);
}
}