これを行うための最適な方法がたくさんあると確信しています。
@Groo がコメント セクションで完全に指摘しているように、たとえばLockBitsメソッドを使用して、インスタンスとの間でピクセルの色を読み書きできBitmap
ます。さらに進んで、コンピューターのグラフィックカードを使用して実際の計算を行うこともできます。
さらに、Color ToGrayscaleColor(Color color)
色をグレースケール バージョンに変換する方法は、光学的に正しくありません。色成分の強度に実際に適用する必要がある比率のセットがあります。1、1、1 の比率を使用しました。それは私にとっては許容できることですが、アーティストや科学者にとってはおそらく恐ろしいことです。
コメント セクションで、@plinth は、解剖学的に正しい変換を行いたい場合に確認する必要があるこの質問を指摘してくれて非常に良かったです: Converting RGB to grayscale/intensity
この非常に理解しやすく実装しやすいソリューションを共有したかっただけです。
まず、Color をグレースケール バージョンに変換する小さなヘルパー:
public static Color ToGrayscaleColor(Color color) {
var level = (byte)((color.R + color.G + color.B) / 3);
var result = Color.FromArgb(level, level, level);
return result;
}
次に、カラー ビットマップをグレースケール ビットマップに変換します。
public static Bitmap ToGrayscale(Bitmap bitmap) {
var result = new Bitmap(bitmap.Width, bitmap.Height);
for (int x = 0; x < bitmap.Width; x++)
for (int y = 0; y < bitmap.Height; y++) {
var grayColor = ToGrayscaleColor(bitmap.GetPixel(x, y));
result.SetPixel(x, y, grayColor);
}
return result;
}
ダブルスの部分はかなり簡単です。Bitmap
オブジェクトは、さまざまな操作で使用できる実際のイメージのメモリ表現です。Bitmap
色深度と画像形式の詳細は、 のインスタンスをストリームまたはファイルにロードおよび保存する場合にのみ関係します。この時点では、それらについて気にする必要はありません。
public static double[,] FromGrayscaleToDoubles(Bitmap bitmap) {
var result = new double[bitmap.Width, bitmap.Height];
for (int x = 0; x < bitmap.Width; x++)
for (int y = 0; y < bitmap.Height; y++)
result[x, y] = (double)bitmap.GetPixel(x, y).R / 255;
return result;
}
そして、double 配列をグレースケール イメージに戻します。
public static Bitmap FromDoublesToGrayscal(double[,] doubles) {
var result = new Bitmap(doubles.GetLength(0), doubles.GetLength(1));
for (int x = 0; x < result.Width; x++)
for (int y = 0; y < result.Height; y++) {
int level = (int)Math.Round(doubles[x, y] * 255);
if (level > 255) level = 255; // just to be sure
if (level < 0) level = 0; // just to be sure
result.SetPixel(x, y, Color.FromArgb(level, level, level));
}
return result;
}
次の行:
if (level > 255) level = 255; // just to be sure
level < 0) level = 0; // just to be sure
ダブルスで操作し、小さなミスの余地を残したい場合に備えて、本当にそこにあります。