Поиск групп пикселей в изображении - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д