Как обвести / выделить / прямоугольник определенных областей изображения?

У меня есть изображение в градациях серого с различными областями, которые необходимо обвести в программе 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 намного проще.

Другие вопросы по тегам