R.NETがすごいです。C#の標準機能では提供されない主成分分析やグラフ画像の作成を簡単かつ信頼できる方法で実行できます。詳細は以下のリンクから。また、Microsoft Visual Studio 2019であればNuGet パッケージマネージャーからプロジェクトへお手軽にインストールできます。
www.nuget.org github.com rdotnet.github.io
■
以下のソースコードで適当な画像ファイルのRGB情報からセンタリング&スケーリングした主成分スコアを算出することができます。
using System.Drawing; using System.Drawing.Imaging; using RDotNet; namespace ConsoleApp1 { class Program { static void Main() { var bmp = new Bitmap(<画像ファイルのパス>); var bmpData = bmp.LockBits( new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); var pixelNo = bmpData.Width * bmpData.Height; var colors = new double[pixelNo, 3]; unsafe { var pixels = (int*)bmpData.Scan0; for (long i = 0; i < pixelNo; i++) { var rgb = Color.FromArgb(pixels[i]); colors[i, 0] = rgb.R; colors[i, 1] = rgb.G; colors[i, 2] = rgb.B; } } bmp.UnlockBits(bmpData); var pcaScores1 = default(double[]); var pcaScores2 = default(double[]); var pcaScores3 = default(double[]); // NOTE: プロジェクトの32/64ビットをインストールしたRと合わせてください。 using (var instance = REngine.GetInstance()) { instance.Initialize(); instance.SetSymbol("x", instance.CreateNumericMatrix(colors)); instance.Evaluate("x.pca <- prcomp(x, scale=TRUE, center=TRUE)"); pcaScores1 = instance.Evaluate("x.pca$x[,1]").AsNumeric().ToArray(); pcaScores2 = instance.Evaluate("x.pca$x[,2]").AsNumeric().ToArray(); pcaScores3 = instance.Evaluate("x.pca$x[,3]").AsNumeric().ToArray(); } } } }