我已经将 rgb 图像转换为灰度图像,我知道通过对相同代码使用阈值我可以获得真正的黑白(二进制)图像,但是在 WP8 中实现时我遇到了问题。无论我指定什么阈值,结果都是完整的背景图像。(我也尝试了各种阈值)。这是 rgb 到灰度代码。请告诉我应该如何修改此代码以获取二进制图像。
private async void rgb2gray_Click(object sender, RoutedEventArgs e)
{
if (takenImage != null)
{
WriteableBitmap srcbitmp = takenImage.Source as WriteableBitmap;
byte[] srcpixels = new byte[4 * srcbitmp.PixelWidth * srcbitmp.PixelHeight];
using (Stream pixelstream = srcbitmp.PixelBuffer.AsStream())
{
await pixelstream.ReadAsync(srcpixels, 0, srcpixels.Length);
}
//create destination bitmap and pixel array
WriteableBitmap dstbitmap = new WriteableBitmap(srcbitmp.PixelWidth, srcbitmp.PixelHeight);
byte[] dstpixels = new byte[4 * dstbitmap.PixelWidth * dstbitmap.PixelHeight];
for (int i = 0; i < srcpixels.Length; i += 4)
{
double b = (double)srcpixels[i] / 255.0;
double g = (double)srcpixels[i + 1] / 255.0;
double r = (double)srcpixels[i + 2] / 255.0;
byte a = srcpixels[i + 3];
double z = (0.21 * r + 0.71 * g + 0.07 * b) * 255;
byte f = Convert.ToByte(z);
dstpixels[i] = f;
dstpixels[i + 1] = f;
dstpixels[i + 2] = f;
dstpixels[i + 3] = a;
}
//moving pixels into destination
using (Stream pixelstream = dstbitmap.PixelBuffer.AsStream())
{
await pixelstream.WriteAsync(dstpixels, 0, dstpixels.Length);
}
dstbitmap.Invalidate();
//display new bitmap
takenImage.Source = dstbitmap;
}
}