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;
  }

ええ、私は トマズの回答から解決策を得ました

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 のようなライブラリをいつでも使用して、ヒストグラムを生成できます。

ヒストグラムを取得したら、すべての値が 2 点の周囲にあるかどうかを確認する必要があります。

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 画像の結果を見てください。

于 2013-04-16T10:12:27.790 に答える
0

簡単な方法: 画像を PNG に変換してから、コードを実行します。

編集: グラフィックスとしてロードするとうまくいくはずですよね?

于 2013-04-16T10:07:05.620 に答える