これは最後の2時間私を困惑させます。画像ファイルを読み取ると、MatlabのimreadとC#のImage.FromFileの間でピクセル値が異なりますか?
aa=imread('myfile.tif')
max(aa(:)) = 248 in matlab
C#では
var image2Array = imageToByteArray((Bitmap) Image.FromFile("myfile.tif"));
byte maxx = 0;
foreach(var a in image2Array)
{
maxx = Math.Max(maxx, a);
}
//maxx = 255
さらに、Matlabでは、
aa(1,1) = 13,
aa(1,2) = 13
しかしC#では
image2Array[0]=17,
image2Array[1]=0
それらは同じである必要があります。
ところで、この場合、ピクセルタイプはuint8です。したがって、寸法の違いはありません。
Imageからバイト配列を取得する方法を聞かれたら、MSDNドキュメントを使用してこのメソッドを作成しました。
public byte[] imageToByteArray(Bitmap bmp)
{
// Lock the bitmap's bits.
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(
rect,
ImageLockMode.ReadWrite,
bmp.PixelFormat);
// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;
// Declare an array to hold the bytes of the bitmap.
int bytes = Math.Abs(bmpData.Stride)*bmp.Height;
byte[] rgbValues = new byte[bytes];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
// Unlock the bits.
bmp.UnlockBits(bmpData);
return rgbValues;
}
私はここで何を間違えましたか?結果として得られる2つの画像は同じように見えるため、異なる読み取りアルゴリズムを使用していると思われます。
アップデート:
私がやっていたことに何も悪いことはないと思います。私は、tifをビットマップとして読み取ることが問題の原因であると結論付けました。この理論を確認するために、
2つの画像を表示しましたが、まったく同じように見えました。ですから、私の側には間違いはないと思います。
opencvで同じファイルを読み取ろうとしましたが、そのピクセル値はmatlabのものとまったく同じでした。これは私にとって驚くべきことでした。これからは、C#でビットマップを慎重に使用します。