Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何替换C#位图中相同颜色的色调变化?_C#_Image Processing_Aforge - Fatal编程技术网

如何替换C#位图中相同颜色的色调变化?

如何替换C#位图中相同颜色的色调变化?,c#,image-processing,aforge,C#,Image Processing,Aforge,范围: 大家好,我正在尝试将此验证码转换为“黑白”(二值化)图像,其中字符为白色,其余部分(背景、线条、随机图片)为黑色 可以找到验证码的链接。刷新将为您提供另一个验证码 原因: 我知道大多数人认为干扰CAPTCHA是错误的,所以我在这里为自己辩护。这将仅用于知识/自我挑战。这些图像没有其他用途 问题: 在研究这些图像一段时间后,我发现一个好办法是将颜色替换为“白色和黄色”为“颜色.黑色”,其他颜色都应替换为“颜色.白色” 在这之后,我将只是“反转”颜色,引导我到我想要的输出 代码示例: 在这段

范围

大家好,我正在尝试将此验证码转换为“黑白”(二值化)图像,其中字符为白色,其余部分(背景、线条、随机图片)为黑色

可以找到验证码的链接。刷新将为您提供另一个验证码

原因:

我知道大多数人认为干扰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谢谢你花时间为我们写一些代码。我现在就看