(источник: googlepages.com)
На изображении выше я хочу отметить край круга красным цветом примерно так
(источник: googlepages.com)
Я понятия не имею, как поступить, любая помощь/предложения будут высоко оценены...
Морфологическая фильтрация будет работать отлично, если вы работаете с бинарными изображениями, такими как вы предоставили. Разверните изображение, а затем вычтите оригинал.
alt text http://img29.imageshack.us/img29/1420/morphf.png
Здесь пример MATLAB:
lImage = zeros(19, 19, 3);
lImage(7:13, 7:13, :) = repmat( ...
[0 0 1 1 1 0 0; ...
0 1 1 1 1 1 0; ...
1 1 1 1 1 1 1; ...
1 1 1 1 1 1 1; ...
1 1 1 1 1 1 1; ...
0 1 1 1 1 1 0; ...
0 0 1 1 1 0 0;], [1 1 3]);
figure; imshow(lImage);
lOutline = imdilate(lImage, strel('disk', 1)) - lImage;
lOutline(:, :, 2:3) = 0;
figure; imshow(lImage + lOutline);
Быстрое и грязное решение. Запустите пиксель изображения по пикселям, если цвет изменится, просто нарисуйте красный пиксель.
PS: Обратите внимание, что это может не работать для квадрата, если вы не делаете то же самое вертикально и горизонтально
Вы почти наверняка захотите использовать Canny Edge Detector, который должен быть в состоянии сделать это легко. В моей линейке продуктов в моей компании есть такой инструмент, и это результат его запуска: alt text http://www.plinth.org/_images/image1Output.gif
Я думаю, что ответ на ваш вопрос - ответ
http://csharpkodu.blogspot.com.tr/2014/04/grafik-snfna-devam.html
Обнаружение кромок? Обработка изображения? OpenCV! Для библиотеки есть С# -комплексоры. Не "легкое" решение, но любой опыт, который вы получите с помощью этой библиотеки, является хорошим строителем резюме. Если ваша компания занимается обработкой изображений, они, вероятно, уже используют ее.
Для этого существует несколько способов.
Первый: - вы знаете, что есть круг, и вам нужно найти, где находится центр, и как это радиус. Таким образом, вы можете использовать Hough transform, чтобы найти их, и они нарисуют ваш круг красным цветом. Прочитайте этот раздел или этот
Второй - использовать обнаружение кромок. Здесь или здесь (здесь для более теоретической точки зрения)
Никогда не приходилось делать что-либо подобное, но мощный инструмент для комплексного манипулирования изображениями:
http://www.imagemagick.org/script/index.php
Много документации и примеров - и .NET-оболочка, если вы не хотите вызывать исполняемый файл.
Я могу по крайней мере указать вам в сторону некоторых довольно аккуратных фильтров обнаружения края: http://www.codeproject.com/KB/GDI-plus/edge_detection.aspx
Я предполагаю, что он вам подойдет хорошо.
В конечном счете вы хотите отредактировать пиксели изображения. На этот вопрос уже был дан ответ Марк Гравелл.
Затем, основываясь на том, какой вариант вы выбираете, LockBits или GetPixel/SetPixel, вам нужно будет выполнить цикл и посмотреть значения цвета на пиксель. Продолжайте цикл, пока не нажмете белый пиксель.
Как только вы это сделаете, проверьте все направления вокруг него, если вы найдете черный пиксель, а затем цвет белый пиксель. Это, конечно, самый простой ответ, и есть способы его оптимизировать, но он будет работать.
Например, если вы хотите ограничить изменение цвета только четырьмя соседними пикселями, вы можете, а не также проверять диагонали.
Интересная проблема - я предполагаю, что "белый круг" в вашем примере - это другое изображение - это значит, что вы сами не рисуете круг?
Если это так, вы можете просканировать все пиксели, чтобы найти белый пиксель, который имеет черный цвет по крайней мере на одной его стороне (либо 4 направления, либо 8, включая углы). Если это совпадение, замените его на красный. Если нет, то игнорируйте его.
Я сомневаюсь, что это лучший способ сделать это, но если это только черное и белое, это может заставить вас начать.
То, что вы ищете, - это обнаружение края. Вы можете найти ряд ресурсов для общего алгоритма в Google: