0

我是在 c# 中使用图像的新手。

我这样做了:

private bool IsBitonal(string FilePath)
{
    Bitmap bitmap = new Bitmap(FilePath);
    return (bitmap.PixelFormat == PixelFormat.Format1bppIndexed)   
}

这适用于 .png 文件,但不适用于 .jpeg 文件,有人可以帮我吗?

是否有任何解决方案来查找图像是否是双色的?

我使用了 Loding 图形的东西,它也不适用于我。

 private bool IsBitonal(string filePath)
 {
        bool isBitonal = false;
        try
        {
            Bitmap bitmap = new Bitmap(filePath);
            Graphics graphics = Graphics.FromImage(bitmap);
        }
        catch (Exception ex)
        {
            isBitonal = true;
        }
        return isBitonal;
  }

是的,我从 Tomaz Answer那里得到了解决方案

这是我在 C# 中的答案:

public bool IsBitonal(Bitmap YourCurrentBitmap)
    {
        Color c;
        long Eadges = 0;
        long Others = 0;
        for (int i = 0; i < YourCurrentBitmap.Width; i++)
        {
            for (int j = 0; j < YourCurrentBitmap.Height; j++)
            {
                c = YourCurrentBitmap.GetPixel(i, j);
                if (!(c.R == c.G && c.G == c.B)) return false;

                if (c.R <= 16||c.R >= 255-16)
                    Eadges++;
                else
                    Others++;
            }
        }
         double proportion = Eadges / (double)Others;
        // here is estimation based on you requirement you can change
         return proportion > 10;;
    }
4

3 回答 3

2

根据定义,JPEG 图像以颜色定义。由于压缩伪影,即使以 JPEG 格式保存并重新读取的双色调图像也永远不会是双色调的。

您所能做的就是进行一些估计,例如创建一个直方图并手动检查(有一些错误)值是否沿着它的边缘分布。

编辑:

这应该是一种计算直方图的快速方法。如果您更喜欢(慢得多)但更简单的方法,则可以对图片中的每个像素使用 getPixel() 。

基于: http ://aforge.googlecode.com/svn/tags/AForge-1.5.0/Sources/Imaging/ImageStatisticsHSL.cs

    private int[] getHistogram( BitmapData imageData )
    {
        int width = imageData.Width;
        int height = imageData.Height;
        int offset = imageData.Stride - width * 3;

        int[] l = new int[256];

        unsafe
        {
            byte * p = (byte *) imageData.Scan0.ToPointer( );

            // for each line
            for ( int y = 0; y < height; y++ )
            {
                // for each pixel
                for ( int x = 0; x < width; x++, p += 3 )
                {
                    int bright = p[RGB.R] + p[RGB.G] + p[RGB.B];
                    bright /= 3;

                    l[bright]++;
                }
                p += offset;
            }
        }

        return l; 
    }

我目前无法对其进行测试,但您应该很容易理解这个想法。您始终可以使用 AForge.NJET 之类的库来生成直方图。

获得直方图后,您应该检查所有值是否都位于两个点附近。

int[] hist = getHistogram(imageData);

hist[n]是亮度为“n”的像素数(范围从 0 到 255)

对于理想图像,所有像素都是白色或黑色,因此 hist[0] 和 hist[255] 将被设置,所有其他值将为零。相反,所有值将分布在 0 和 255 附近。例如,您可以计算黑白像素与其他像素的比例。

int eadges = 0; // black, white or very close to black/white
int others = 0;

for(int i =0; i<hist.length; i++)
{
   if(i < 16 || i > 255-16) eadges += hist[i];
   else others += hist[i];     
}

double proportion = eadges/(double)others;
return proportion > 10;

16 和 10 只是示例 - 您可以选择其他数字以获得不同的检测精度。

如果您愿意,您应该能够轻松找到有关直方图和其他计算方法的更多信息。首先查看直方图的 Google Image 结果。

于 2013-04-16T10:12:27.790 回答
1

与 PNG 图像相反,JPEG 图像不能是双色调的,因为它编码颜色信息的方式。你可以在这里阅读更多信息:http ://en.wikipedia.org/wiki/JPEG

我想您可以计算图片中不同颜色的数量来确定它是否是双色调的,但是 JPEG 伪影(即边缘周围的颜色溢出)会给出不正确的结果。

于 2013-04-16T10:03:17.180 回答
0

最简单的方法:尝试将您的图像转换为 PNG,然后运行您的代码。

编辑:加载为图形应该可以解决问题,不是吗?

于 2013-04-16T10:07:05.620 回答