Поиск групп пикселей в изображении - 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)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы