Я пытаюсь реализовать распознавание лиц в C #. В настоящее время у меня есть черно-белый контур фотографии с лицом внутри ( Здесь ). Однако сейчас я пытаюсь устранить шум и затем расширить изображение, чтобы повысить надежность при реализации обнаружения.
Метод, который у меня есть до сих пор, здесь:
using System;
using System.Collections.Generic
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace ImageErosion
{
public partial class Form1 : Form
{
public int CompareEmptyColor { get; set; }
public Form1()
{
InitializeComponent();
}
private void btErodeImage_Click(object sender, EventArgs e)
{
Image inputImage = pbInputImage.Image;
Image result = Process(inputImage);
pbInputImage.Image = result;
}
unsafe public Image Process(Image input)
{
Bitmap bmp = (Bitmap)input;
Bitmap bmpSrc = (Bitmap)input;
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format1bppIndexed);
int stride = bmData.Stride;
int stride2 = bmData.Stride * 2;
IntPtr Scan0 = bmData.Scan0;
byte* p = (byte*)(void*)Scan0;
int nOffset = stride - bmp.Width * 3;
int nWidth = bmp.Width - 2;
int nHeight = bmp.Height - 2;
var w = bmp.Width;
var h = bmp.Height;
var rp = p;
var empty = CompareEmptyColor;
byte c, cm;
int i = 0;
// Erode every pixel
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x += 3, i++)
{
// Middle pixel
cm = p[y * stride + x];
if (cm == empty) { continue; }
#region FirstRow
// Row 0
// Left pixel
if (x - 3 > 0 && y - 2 > 0)
{
c = p[(y - 2) * stride + (x - 3)];
if (c == empty) { continue; }
}
// Middle left pixel
if (x - 2 > 0 && y - 2 > 0)
{
c = p[(y - 2) * stride + (x - 2)];
if (c == empty) { continue; }
}
if (x - 1 > 0 && y - 2 > 0)
{
c = p[(y - 2) * stride + (x - 1)];
if (c == empty) { continue; }
}
if (y - 2 > 0)
{
c = p[(y - 2) * stride + x];
if (c == empty) { continue; }
}
if (x + 1 < w && y - 2 > 0)
{
c = p[(y - 2) * stride + (x + 1)];
if (c == empty) { continue; }
}
if (x + 2 < w && y - 2 > 0)
{
c = p[(y - 2) * stride + (x + 2)];
if (c == empty) { continue; }
}
if (x + 3 < w && y - 2 > 0)
{
c = p[(y - 2) * stride + (x + 3)];
if (c == empty) { continue; }
}
#endregion
#region SecondRow
// Row 1
// Left pixel
if (x - 3 > 0 && y - 1 > 0)
{
c = p[(y - 1) * stride + (x - 3)];
if (c == empty) { continue; }
}
if (x - 2 > 0 && y - 1 > 0)
{
c = p[(y - 1) * stride + (x - 2)];
if (c == empty) { continue; }
}
if (x - 1 > 0 && y - 1 > 0)
{
c = p[(y - 1) * stride + (x - 1)];
if (c == empty) { continue; }
}
if (y - 1 > 0)
{
c = p[(y - 1) * stride + x];
if (c == empty) { continue; }
}
if (x + 1 < w && y - 1 > 0)
{
c = p[(y - 1) * stride + (x + 1)];
if (c == empty) { continue; }
}
if (x + 2 < w && y - 1 > 0)
{
c = p[(y - 1) * stride + (x + 2)];
if (c == empty) { continue; }
}
if (x + 3 < w && y - 1 > 0)
{
c = p[(y - 1) * stride + (x + 3)];
if (c == empty) { continue; }
}
#endregion
#region ThirdRow
// Row 2
if (x - 3 > 0)
{
c = p[y * stride + (x - 3)];
if (c == empty) { continue; }
}
if (x - 2 > 0)
{
c = p[y * stride + (x - 2)];
if (c == empty) { continue; }
}
if (x - 1 > 0)
{
c = p[y * stride + (x - 1)];
if (c == empty) { continue; }
}
if (x + 1 < w)
{
c = p[y * stride + (x + 1)];
if (c == empty) { continue; }
}
if (x + 2 < w)
{
c = p[y * stride + (x + 2)];
if (c == empty) { continue; }
}
if (x + 3 < w)
{
c = p[y * stride + (x + 3)];
if (c == empty) { continue; }
}
#endregion
#region FourthRow
// Row 3
if (x - 3 > 0 && y + 1 < h)
{
c = p[(y + 1) * stride + (x - 3)];
if (c == empty) { continue; }
}
if (x - 2 > 0 && y + 1 < h)
{
c = p[(y + 1) * stride + (x - 2)];
if (c == empty) { continue; }
}
if (x - 1 > 0 && y + 1 < h)
{
c = p[(y + 1) * stride + (x - 1)];
if (c == empty) { continue; }
}
if (y + 1 < h)
{
c = p[(y + 1) * stride + x];
if (c == empty) { continue; }
}
if (x + 1 < w && y + 1 < h)
{
c = p[(y + 1) * stride + (x + 1)];
if (c == empty) { continue; }
}
if (x + 2 < w && y + 1 < h)
{
c = p[(y + 1) * stride + (x + 2)];
if (c == empty) { continue; }
}
if (x + 3 < w && y + 1 < h)
{
c = p[(y + 1) * stride + (x + 3)];
if (c == empty) { continue; }
}
#endregion
#region FifthRow
// Row 4
if (x - 3 > 0 && y + 2 < h)
{
c = p[(y + 2) * stride + (x - 3)];
if (c == empty) { continue; }
}
if (x - 2 > 0 && y + 2 < h)
{
c = p[(y + 2) * stride + (x - 2)];
if (c == empty) { continue; }
}
if (x - 1 > 0 && y + 2 < h)
{
c = p[(y + 2) * stride + (x - 1)];
if (c == empty) { continue; }
}
if (y + 2 < h)
{
c = p[(y + 2) * stride + x];
if (c == empty) { continue; }
}
if (x + 1 < w && y + 2 < h)
{
c = p[(y + 2) * stride + (x + 1)];
if (c == empty) { continue; }
}
if (x + 2 < w && y + 2 < h)
{
c = p[(y + 2) * stride + (x + 2)];
if (c == empty) { continue; }
}
if (x + 3 < w && y + 2 < h)
{
c = p[(y + 2) * stride + (x + 3)];
if (c == empty) { continue; }
}
#endregion
// If all neighboring pixels are processed
// it's clear that the current pixel is not a boundary pixel.
rp[i] = cm;
}
}
bmpSrc.UnlockBits(bmData);
return bmpSrc;
}
}
}
Насколько я понимаю, чтобы стереть изображение (и убрать шум), нам нужно проверить каждый пиксель, чтобы увидеть, являются ли его окружающие пиксели черными, и если это так, то это пиксель границы, и нам не нужно оставь его, что, как я полагаю, делает мой код, поэтому я не понимаю, почему он не работает.
Любая помощь или указатели будут с благодарностью
Спасибо,
Chris