0
画像処理の目的で、C#のメジアンフィルタの実装に問題があります。私は安全でないロックビットの方法でこのフィルタを実装しました。問題は、私が受け取っている画像が何とかhorrizontalの方法でぼやけています(ノイズは減少しています)。 "(jは*のstride0))+(バイト);"メジアンフィルタが正しく機能しない理由がわかりません
public static Bitmap ArithmeticMean(Bitmap bitmap, int filterSize)
{
if (bitmap == null)
{
throw new ArgumentNullException("bitmap");
}
Bitmap clonnedBitmap = (Bitmap)bitmap.Clone();
Bitmap secondClonnedBitmap = (Bitmap)bitmap.Clone();
BitmapData srcData = clonnedBitmap.LockBits(new Rectangle(0, 0, clonnedBitmap.Width, clonnedBitmap.Height),
ImageLockMode.ReadWrite, bitmap.PixelFormat);
BitmapData newData = secondClonnedBitmap.LockBits(new Rectangle(0, 0, secondClonnedBitmap.Width, secondClonnedBitmap.Height),
ImageLockMode.ReadWrite, bitmap.PixelFormat);
int bytesPerPixel = Image.GetPixelFormatSize(srcData.PixelFormat)/8;
int stride0 = srcData.Stride;
int stride1 = newData.Stride;
int sideOfLoop = (filterSize-1)/2;
unsafe
{
byte* scan0 = (byte*)srcData.Scan0.ToPointer();
byte* scan1 = (byte*)newData.Scan0.ToPointer();
int width = clonnedBitmap.Width * bytesPerPixel;
int height = clonnedBitmap.Height;
int i, j;
for (int y = sideOfLoop; y < height - sideOfLoop; y++)
{
byte* currentLine = scan0 + y * stride0;
byte* currentLineNewObject = scan1 + y* stride1;
for (int x = sideOfLoop; x < width - sideOfLoop*bytesPerPixel; x += bytesPerPixel)
{
var sumRed = 0;
var sumGreen = 0;
var sumBlue = 0;
for (i = -sideOfLoop; i <= sideOfLoop; i++)
{
for (j = -sideOfLoop; j <= sideOfLoop; j++)
{
int oldBlue = (int) (currentLine[x + i*bytesPerPixel] + (byte) (j* stride0));
int oldGreen = (int)(currentLine[x + 1 + i * bytesPerPixel] + (byte)(j * stride0));
int oldRed = (int)(currentLine[x + 2 + i * bytesPerPixel] + (byte)(j * stride0));
sumBlue += oldBlue;
sumGreen += oldGreen;
sumRed += oldRed;
}
}
int newBlue = sumBlue/(filterSize * filterSize);
int newGreen = sumGreen/(filterSize * filterSize);
int newRed = sumRed/(filterSize * filterSize);
currentLineNewObject[x + 2] = (byte)(newRed);
currentLineNewObject[x + 1] = (byte)(newGreen);
currentLineNewObject[x] = (byte)(newBlue);
}
}
}
clonnedBitmap.UnlockBits(srcData);
secondClonnedBitmap.UnlockBits(newData);
return secondClonnedBitmap;
}
これは 'currentLine'のもので、アドレスはまったく同じで、結果は変更されません – Pawel