如何替换C#位图中相同颜色的色调变化?
范围: 大家好,我正在尝试将此验证码转换为“黑白”(二值化)图像,其中字符为白色,其余部分(背景、线条、随机图片)为黑色 可以找到验证码的链接。刷新将为您提供另一个验证码 原因: 我知道大多数人认为干扰CAPTCHA是错误的,所以我在这里为自己辩护。这将仅用于知识/自我挑战。这些图像没有其他用途 问题: 在研究这些图像一段时间后,我发现一个好办法是将颜色替换为“白色和黄色”为“颜色.黑色”,其他颜色都应替换为“颜色.白色” 在这之后,我将只是“反转”颜色,引导我到我想要的输出 代码示例: 在这段代码中,我试图将每个图像的颜色“黑色”替换为天蓝色像素如何替换C#位图中相同颜色的色调变化?,c#,image-processing,aforge,C#,Image Processing,Aforge,范围: 大家好,我正在尝试将此验证码转换为“黑白”(二值化)图像,其中字符为白色,其余部分(背景、线条、随机图片)为黑色 可以找到验证码的链接。刷新将为您提供另一个验证码 原因: 我知道大多数人认为干扰CAPTCHA是错误的,所以我在这里为自己辩护。这将仅用于知识/自我挑战。这些图像没有其他用途 问题: 在研究这些图像一段时间后,我发现一个好办法是将颜色替换为“白色和黄色”为“颜色.黑色”,其他颜色都应替换为“颜色.白色” 在这之后,我将只是“反转”颜色,引导我到我想要的输出 代码示例: 在这段
WebRequests wr = new WebRequests(); // My class to handle WebRequests
Bitmap bmp;
string url = "http://www.fazenda.rj.gov.br/projetoCPS/codigoImagem";
bmp = wr.GetBitmap (url);
for (int i = 1; i < bmp.Height ; i++)
{
for (int j = 1 ; j < bmp.Width ; j++)
{
if (bmp.GetPixel(j,i).Equals(Color.Black))
{
bmp.SetPixel(j,i, Color.SkyBlue);
}
}
}
WebRequests wr=newwebrequests();//我的类处理WebRequests
位图bmp;
字符串url=”http://www.fazenda.rj.gov.br/projetoCPS/codigoImagem";
bmp=wr.GetBitmap(url);
对于(int i=1;i
这个代码根本不起作用,我不知道为什么,但在这个例子中没有像素被替换
问题:
我怎样才能做到这一点?我错过了什么
另外,对我来说,理想的情况是将这张图片的调色板“减少”为“基本”颜色,这将使我在这里的工作更容易
我已经试过了,我用它来减少颜色,但它根本不起作用,结果不是我所期望的
为了正确地对该图像进行二值化,我可以在这里做什么
提前感谢,
Marcello Lins.您的算法不起作用的原因是您正在寻找精确匹配。但由于JPEG压缩伪影,图像中的黑色不是真正的黑色;在我加载的三个验证码中,甚至没有一个黑色(0,0,0)像素。最接近的值是(0,0,4),它看起来是黑色的,但不是 一种近似方法是:
- 删除通道平均值低于220且带有灰色的所有灰色(通道之间的差异小于5%)。这将消除浅灰色细线以及灰色背景下的许多振铃(JPEG)瑕疵
- 将红色、绿色或蓝色通道比其他两个通道高出25%以上的所有像素替换为灰色。这将照顾到红色,绿色和蓝色以及他们的大部分响铃文物
- 运行一个简单的去斑点(despeckle)以删除所有由五个灰度包围的非灰度像素,并且在20%范围内没有其他相同颜色的像素
// Very basic (and CIE-incorrect) check
public static int isGray(Color c)
{
if (Math.Abs(c.R - c.G) > 5 * 2.55) return 0; // Not gray. R and G too different
if (Math.Abs(c.R - c.B) > 5 * 2.55) return 0;
if (Math.Abs(c.G - c.B) > 5 * 2.55) return 0;
return 1;
}
// the blind man's test for shading :-)
public static int isShadeOfRed(Color c)
{
if (4*c.R < 5*c.G) return 0; // Red not strong enough in respect to green
if (4*c.R < 5*c.B) return 0; // Red not strong enough in respect to blue
return 1; // Red is stronger enough than green and blue to be called "shade of red"
}
// (shades of green and blue left as an exercise)
// Very basic (and CIE-incorrect) check
public static int areSameColor(Color a, Color b)
{
if (Math.Abs(a.R - b.R) > 5 * 2.55) return 0;
if (Math.Abs(a.G - b.G) > 5 * 2.55) return 0;
if (Math.Abs(a.B - b.B) > 5 * 2.55) return 0;
return 1; // "more or less" the same color
}
// This is more or less pseudo code...
public static int isNoise(int x, int y)
{
if ((x < 1) || (y < 1)) return 0; // or maybe "return 1"
if ((x+1 >= bmp.Width)||(y+1 >= bmp.Height)) return 0;
pix = bmp.GetPixel(x,y);
for (i = -1; i <= 1; i++)
for (j = -1; j <= 1; j++)
{
if ((i == 0) && (j == 0)) continue;
test = bmp.GetPixel(x+i, y+j);
if (isGray(test)) grays++;
if (isSameColor(pix, test)) same++;
}
// Pixel surrounded by grays, and has no neighbours of the same colour
// (who knows, maybe we could skip gray calculation and check altogether?)
// is noise.
if ((grays == 5) && (same == 0))
return 1;
return 0;
}
// NOTE: do not immediately set to gray pixels found to be noise, for their neighbours
// will be calculated using the new gray pixel. Damage to image might result.
// Use a copy of bmp instead.
//非常基本(且CIE不正确)的检查
公共静态整数为灰色(c色)
{
if(Math.Abs(c.R-c.G)>5*2.55)返回0;//不是灰色的。R和G太不同了
if(Math.Abs(c.R-c.B)>5*2.55)返回0;
if(Math.Abs(c.G-c.B)>5*2.55)返回0;
返回1;
}
//盲人阴影测试:-)
公共静态int isShadeOfRed(c色)
{
如果(4*c.R<5*c.G)返回0;//红色相对于绿色不够强
如果(4*c.R<5*c.B)返回0;//红色相对于蓝色不够强
return 1;//红色比绿色和蓝色强,称为“红色阴影”
}
//(绿色和蓝色的阴影作为练习离开)
//非常基本(且CIE不正确)检查
公共静态int areSameColor(颜色a、颜色b)
{
if(Math.Abs(a.R-b.R)>5*2.55)返回0;
如果(数学Abs(a.G-b.G)>5*2.55)返回0;
if(Math.Abs(a.B-B.B)>5*2.55)返回0;
返回1;/“或多或少”相同颜色
}
//这或多或少是伪代码。。。
公共静态整数isNoise(整数x,整数y)
{
如果((x<1)|(y<1))返回0;//或者可能是“返回1”
如果((x+1>=bmp.Width)|(y+1>=bmp.Height))返回0;
pix=bmp.GetPixel(x,y);
对于(i=-1;i)我看到的验证码包含一个黄色的“Q”和“C”以及一个黑色的“Q”,但也包含一个白色的“W”和一个白色的“C”,你的方法会使它们消失为黑色。它们不会消失,因为背景是灰色的,从来不会是黑色的。我想让所有字符都有相同的颜色,因为字符颜色只能是黑色“白色、黄色和黑色”,我会让所有字符都变成黑色,其他颜色都会被视为背景。为了再次检查,你测试过它吗?有几个CAPTCHA,是的。但是你可能想用这些阈值进行实验,比如“220”“。我认为可能会进一步提高。另外,这取决于以后使用的OCR:我在五个灰度处停止了去斑点,因为否则它会剪裁字符的灰度。可能是四个或六个,会给出更好的最终结果。@Iserni您介意通过pastebin给我发送一些代码,以便我了解“删除所有灰色通道”的含义吗?”? Thanks@Iserni谢谢你花时间为我们写一些代码。我现在就看