Поиск групп пикселей в изображении - C#
Формулировка задачи:
Всем привет. Хочу посоветоваться в решении задачи.
Есть сканированное изображение. Это изображение представляет собой просто фон с отмеченными ручкой точками. Нужно найти на сканированном изображении все эти точки и обвести их в кружок.
Как по-моему нужно решать эту задачу.
1) Считать изображение в массив байт;
2) Пройдясь по массиву, определить цвет фона (это та составляющая RGB, которая встречается в массиве чаще всего);
3) Найти пиксели (координаты), цвет которых сильно отличается от цвета фона (в этом основная загвоздка);
4) Определить пиксели из пункта 3 и проверить их на предмет близкого расположения друг другу;
5) Определить центры полученных областей и в изображении нарисовать кружки.
Делать начал так:
Прошу помощи в дальнейшем решении. Возможно подход изначально неверный, так как сканированное изображение имеет множество дефектов и таким способом фон определить и не представится возможным.
public class PointSearch
{
private Bitmap bitMap;
private Hashtable PixelColorsCounts; // таблица цветов изображения с кол-вом
private byte[] BytesArr; // массив хранения байтов
private Color backGroundColor; // цвет фона
/// <summary>
/// Контсруктор
/// </summary>
/// <param name="Image">Готовый битмап для работы</param>
public PointSearch(Bitmap Image)
{
this.bitMap = Image; // копируем картинку в переменную
Rectangle r=new Rectangle(0,0, this.bitMap.Width, this.bitMap.Height);
BitmapData bData=this.bitMap.LockBits(r, ImageLockMode.ReadWrite, this.bitMap.PixelFormat);
IntPtr Pointer=bData.Scan0;
int sizeArr = Math.Abs(bData.Stride) * this.bitMap.Height;
this.BytesArr = new byte[sizeArr];
Marshal.Copy(Pointer, BytesArr, 0, sizeArr);
PixelColorsCounts = new Hashtable();
for (int i = 0; i < BytesArr.Length-3; i+=3)
{
// наполняем таблицу
Color cC = Color.FromArgb(BytesArr[i + 2], BytesArr[i + 1], BytesArr[i]); // очередной цвет
if (!PixelColorsCounts.ContainsKey(cC))
{
PixelColorsCounts.Add(cC, 1);
}
else
{
PixelColorsCounts[cC] = Convert.ToInt32(PixelColorsCounts[cC])+1;
}
}
int max = 0;
Color cTmp=new Color();
// находим цвет с наибольшим кол-во в таблице
foreach (Color tmp in PixelColorsCounts.Keys)
{
if (Convert.ToInt32(PixelColorsCounts[tmp]) > max)
{
max = Convert.ToInt32(PixelColorsCounts[tmp]);
cTmp =(Color) tmp;
}
}
backGroundColor = cTmp;
this.bitMap.UnlockBits(bData);
}
/// <summary>
/// Возвращает цвет вычисленного фона изображения
/// </summary>
public Color BackGroundColor
{
get { return this.backGroundColor; }
}
}Решение задачи: «Поиск групп пикселей в изображении»
textual
Листинг программы
s=Math.Sqrt(R*R+G*G+B*B)-Math.Sqrt(R0*R0+G0*G0+B0*B0)