i 试图在我的视窗电话附录中应用电离和电离算法:
但很难做到: i 仅举一例调查,见http://channel9.msdn.com/coding4fun/articles/FaceLight-Silverlight-4-Real-time-Face-Detection”rel=“nofollow noreferer”http://channel9.msdn.com/coding4fun/articles/FaceLight-Silverlight-4-Real-time-Face-Detection。
FaceLight for Silverlight.
Is a very good example and that have Erode and Dilate algorithms , but my app have some differences , FaceLight take a picture from camera and I want my app load some image from Gallery and apply that algorithms.
I follow this steps 1.- Load the image from gallery.
PhotoChooserTask photo = new PhotoChooserTask();
photo.Completed += (s, ee) =>
{
BitmapImage image = new BitmapImage();
image.SetSource(ee.ChosenPhoto);
image.CreateOptions = BitmapCreateOptions.None;
this.imgoriginal.Source = image;
GrayTimer.Start();
};
photo.Show();
2. 图像从直观图像中获取。
WriteableBitmap grayimg = Operations.doGray(imgoriginal); // get the grayscale image
BitmapImage imggray = new BitmapImage();
stream = new MemoryStream(grayimg.ToByteArray()); // get the array of the image
this.Dispatcher.BeginInvoke(() =>
{
grayimg.SaveJpeg(stream, 320, 240, 0, 90); // resize and set quality
imggray.SetSource(stream);
grayImage.Source = imggray;// set the grayscale image in the control.
});
这种方法
public static WriteableBitmap doGray(Image image)
{
WriteableBitmap bitmap = new WriteableBitmap(image, null);
for (int y = 0; y < bitmap.PixelHeight; y++)
{
for (int x = 0; x < bitmap.PixelWidth; x++)
{
int pixelLocation = bitmap.PixelWidth * y + x;
int pixel = bitmap.Pixels[pixelLocation];
byte[] pixelbytes = BitConverter.GetBytes(pixel);
byte bwPixel = (byte)(.299 * pixelbytes[2] + .587 * pixelbytes[1] + .114 * pixelbytes[0]);
pixelbytes[0] = bwPixel;
pixelbytes[1] = bwPixel;
pixelbytes[2] = bwPixel;
bitmap.Pixels[pixelLocation] = BitConverter.ToInt32(pixelbytes, 0);
}
}
return bitmap;
}
所有工作罚款。
现在,我采用Erode Algorithm。
WriteableBitmap g;
BitmapImage imggray = new BitmapImage();
imggray =(BitmapImage) grayImage.Source; // get the gray image from the Control.
g = new WriteableBitmap(imggray);
// i apply 3 times for try to see something :S
er = Operations.Erode(g);
for (int i = 1; i <= 2; i++)
{
Stream str = new MemoryStream(er.ToByteArray());
BitmapImage r = new BitmapImage();
WriteableBitmap n;
er.SaveJpeg(str, 320, 240,0, 100);
r.SetSource(str);
n = new WriteableBitmap(r);
er = Operations.Erode(n);
}
this.Dispatcher.BeginInvoke(() =>
{
stream = new MemoryStream(er.ToByteArray());
BitmapImage result = new BitmapImage();
er.SaveJpeg(stream, 320, 240, 0, 100);
result.SetSource(stream);
imgerode.Source = result;
});
此处为埃尔德算法。
// Process method of the Erode5x5Filter class
public static WriteableBitmap Erode(WriteableBitmap input)
{
var p = input.Pixels;
var w = input.PixelWidth;
var h = input.PixelHeight;
var result = new WriteableBitmap(w, h);
var rp = result.Pixels;
var empty = 0; // = 0
int c, cm;
int i = 0;
// Erode every pixel
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++, i++)
{
// Middle pixel
cm = p[y * w + x];
if (cm == empty) { continue; }
// Row 0
// Left pixel
if (x - 2 > 0 && y - 2 > 0)
{
c = p[(y - 2) * w + (x - 2)];
if (c == empty) { continue; }
}
// Middle left pixel
if (x - 1 > 0 && y - 2 > 0)
{
c = p[(y - 2) * w + (x - 1)];
if (c == empty) { continue; }
}
if (y - 2 > 0)
{
c = p[(y - 2) * w + x];
if (c == empty) { continue; }
}
if (x + 1 < w && y - 2 > 0)
{
c = p[(y - 2) * w + (x + 1)];
if (c == empty) { continue; }
}
if (x + 2 < w && y - 2 > 0)
{
c = p[(y - 2) * w + (x + 2)];
if (c == empty) { continue; }
}
// Row 1
// Left pixel
if (x - 2 > 0 && y - 1 > 0)
{
c = p[(y - 1) * w + (x - 2)];
if (c == empty) { continue; }
}
// ...
// ... Process the rest of the 24 neighboring pixels
// ...
// If all neighboring pixels are processed
// it s clear that the current pixel is not a boundary pixel.
rp[i] = cm;
}
}
return result;
}
这里是结果:没有发生:
and the same issue with Dilate algorithm but the result image is a blank image . Any ideas o suggestions?? I need help please.