そのため、Windows RT のアプリに WriteableBitmapEx を使用しています。sobel 演算子を使用して、画像にエッジ検出を実装しようとしています。.Convolute() を使用して、x 検出と y 検出の両方のカーネルを画像に正常に適用しましたが、両方の画像を 1 つに追加するのに行き詰まりました。問題は、両方の画像のすべてのピクセルの透明度が 0 のように見えることです (つまり、ARGB の A)。問題なく両方の画像を単独で表示できますが、それらを追加すると黒い画像になります。だから私の質問は:
- 畳み込み後にすべてのピクセルの透明度が 0 に設定されるのはなぜですか?
- イメージを真っ黒にせずに表示できるのはなぜですか?
- 2 つの画像を追加すると黒くなるのはなぜですか?
- 2 つの画像を結合するより良い方法はありますか? 残念なことに、この種のピクセル追加はサポートされていないようです。しかし、ForEach は本当に遅いです...
カルリフィケーションのために、これまでの私のコードは次のとおりです。wbmpY と wbmpX の両方を表示できますが、finalbmp は真っ黒です。
public int[,] sobelY = new int[3, 3] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } };
public int[,] sobelX = new int[3, 3] { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } };
public void trim(WriteableBitmap wbmp)
{
var graybmp = wbmp.Clone();
graybmp.ForEach(toGrayscale);
var wbmpY = graybmp.Clone();
var wbmpX = graybmp.Clone();
wbmpY = wbmpY.Convolute(sobelY, 1, 0);
wbmpX = wbmpX.Convolute(sobelX, 1, 0);
var finalbmp = combineSobel(wbmpX, wbmpY);
}
public WriteableBitmap combineSobel(WriteableBitmap img, WriteableBitmap img2)
{
int height = img.PixelHeight;
int width = img.PixelWidth;
WriteableBitmap result = img.Clone();
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
Color imgColor = img.GetPixel(x, y);
Color img2Color = img2.GetPixel(x, y);
Color newColor = Color.FromArgb(
Math.Min((byte)Math.Sqrt(Math.Pow(imgColor.A, 2) + Math.Pow(img2Color.A, 2)), (byte)255),
Math.Min((byte)Math.Sqrt(Math.Pow(imgColor.R, 2) + Math.Pow(img2Color.R, 2)), (byte)255),
Math.Min((byte)Math.Sqrt(Math.Pow(imgColor.G, 2) + Math.Pow(img2Color.G, 2)), (byte)255),
Math.Min((byte)Math.Sqrt(Math.Pow(imgColor.B, 2) + Math.Pow(img2Color.B, 2)), (byte)255)
);
result.SetPixel(x, y, newColor);
}
}
return result;
}