Как обвести / выделить / прямоугольник определенных областей изображения?
У меня есть изображение в градациях серого с различными областями, которые необходимо обвести в программе WPF C#. Пример такого изображения будет следующим:
Области, которые я хочу обвести, являются белыми, таким образом:
Пока что я пытаюсь создать массив байтов, состоящий из интенсивности каждого пикселя (0 - черно-белый, 4000 и выше). Затем я пропускаю каждый байт через пороговый тест, чтобы увидеть, является ли он пикселем. с частью региона в нем или нет (например, если длина байтов превышает 3500, считайте его частью региона, иначе это не так).
Я в тупик, что делать после этого. Пока что одна из моих идей - найти первый пиксель области в строке, а затем найти последний пиксель области строки в нижней части области (так что вверху слева и внизу справа.) Затем я найду расстояние между обоими пикселями и используйте его, чтобы получить центральную точку (из которой я мог бы использовать, чтобы получить координаты, необходимые для рисования окружности.) Проблемы с этим методом, я думаю, были бы шумом, который или заставил бы появиться много кругов на изображении или дезинформированные круги. Я думаю, что я мог бы использовать пороги, чтобы устранить маленькие круги, хотя.
Эти изображения на самом деле являются кадрами видео (информация получается в виде байтового массива, а затем записывается в WriteableBitmap), поэтому я не знаю, будет ли слишком много манипуляций с данными задерживать кадры. Я также новичок в C#, байтах и CS в целом, но этот проект - то, чем я занялся во время зимних каникул, чтобы научиться программировать. Любые ответы или ресурсы будут высоко оценены, особенно в псевдокоде или C#.
1 ответ
Из того, что вы сказали, для меня это звучит как проблема с компьютерным зрением. Раньше я разрабатывал несколько приложений для проблем с CV на основе C#. Основная идея заключается в использовании GDI+ для маршала Bitmap.Lockbits()
возражать в Byte[]
и делать манипуляции, или просто использовать Bitmap.SetPixel() Bitmap.GetPixel()
, но они терпимо медленнее.
Отличным выбором является использование EmguCV. Оболочка OpenCV для.NET 2.0 и выше. Таким образом, написание C# для решения проблемы CV намного проще.