因此,我将 WriteableBitmapEx 用于 Windows RT 上的应用程序。我正在尝试使用 sobel 运算符对图像进行边缘检测。我已经使用 .Convolute() 成功地将用于 x 和 y 检测的两个内核应用到图像上,但现在我坚持将两个图像都添加到一个图像中。问题是,这两个图像的所有像素似乎都具有透明度值 0(因此 ARGB 中的 A)。我可以毫无问题地单独显示这两个图像,但是添加它们只会给我一张黑色的图片。所以我的问题是:
- 为什么卷积后每个像素的透明度都设置为0?
- 为什么我仍然可以显示图像而不是全黑?
- 为什么我添加两个图像时它是黑色的?
- 有没有更好的方法来组合两个图像?Blit unfortunatley 似乎不支持这种像素添加。但是 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;
}