1

我已经将 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;
            }
        }
4

0 回答 0