обработка черно-белых изображений в C #

2

Изображение 174551
(источник: googlepages.com)

На изображении выше я хочу отметить край круга красным цветом примерно так

Изображение 174551
(источник: googlepages.com)

Я понятия не имею, как поступить, любая помощь/предложения будут высоко оценены...

Теги:
image-processing
image-manipulation

12 ответов

3
Лучший ответ

Морфологическая фильтрация будет работать отлично, если вы работаете с бинарными изображениями, такими как вы предоставили. Разверните изображение, а затем вычтите оригинал.

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);
4

Быстрое и грязное решение. Запустите пиксель изображения по пикселям, если цвет изменится, просто нарисуйте красный пиксель.

PS: Обратите внимание, что это может не работать для квадрата, если вы не делаете то же самое вертикально и горизонтально

  • 1
    Скорее всего, это самое быстрое решение этой ограниченной проблемы. Нет необходимости использовать более мощный детектор краев для этой проблемы!
2

Вы почти наверняка захотите использовать Canny Edge Detector, который должен быть в состоянии сделать это легко. В моей линейке продуктов в моей компании есть такой инструмент, и это результат его запуска: alt text http://www.plinth.org/_images/image1Output.gif

  • 0
    Детектор Canny Edge кажется излишним, если он не работает с более сложными изображениями.
1

Я думаю, вам нужен алгоритм обнаружения границ. Попробуйте this или this.

  • 0
    спасибо большое за отзыв Антон, попробуй те
0

Я думаю, что ответ на ваш вопрос - ответ

http://csharpkodu.blogspot.com.tr/2014/04/grafik-snfna-devam.html

0

Обнаружение кромок? Обработка изображения? OpenCV! Для библиотеки есть С# -комплексоры. Не "легкое" решение, но любой опыт, который вы получите с помощью этой библиотеки, является хорошим строителем резюме. Если ваша компания занимается обработкой изображений, они, вероятно, уже используют ее.

0

Для этого существует несколько способов.

Первый:  - вы знаете, что есть круг, и вам нужно найти, где находится центр, и как это радиус. Таким образом, вы можете использовать Hough transform, чтобы найти их, и они нарисуют ваш круг красным цветом. Прочитайте этот раздел или этот

Второй - использовать обнаружение кромок. Здесь или здесь (здесь для более теоретической точки зрения)

0

Никогда не приходилось делать что-либо подобное, но мощный инструмент для комплексного манипулирования изображениями:

http://www.imagemagick.org/script/index.php

Много документации и примеров - и .NET-оболочка, если вы не хотите вызывать исполняемый файл.

0

Я могу по крайней мере указать вам в сторону некоторых довольно аккуратных фильтров обнаружения края: http://www.codeproject.com/KB/GDI-plus/edge_detection.aspx

Я предполагаю, что он вам подойдет хорошо.

0

В конечном счете вы хотите отредактировать пиксели изображения. На этот вопрос уже был дан ответ Марк Гравелл.

Затем, основываясь на том, какой вариант вы выбираете, LockBits или GetPixel/SetPixel, вам нужно будет выполнить цикл и посмотреть значения цвета на пиксель. Продолжайте цикл, пока не нажмете белый пиксель.

Как только вы это сделаете, проверьте все направления вокруг него, если вы найдете черный пиксель, а затем цвет белый пиксель. Это, конечно, самый простой ответ, и есть способы его оптимизировать, но он будет работать.

Например, если вы хотите ограничить изменение цвета только четырьмя соседними пикселями, вы можете, а не также проверять диагонали.

0

Интересная проблема - я предполагаю, что "белый круг" в вашем примере - это другое изображение - это значит, что вы сами не рисуете круг?

Если это так, вы можете просканировать все пиксели, чтобы найти белый пиксель, который имеет черный цвет по крайней мере на одной его стороне (либо 4 направления, либо 8, включая углы). Если это совпадение, замените его на красный. Если нет, то игнорируйте его.

Я сомневаюсь, что это лучший способ сделать это, но если это только черное и белое, это может заставить вас начать.

0

То, что вы ищете, - это обнаружение края. Вы можете найти ряд ресурсов для общего алгоритма в Google:

http://www.google.com/search?q=edge+detection+.net

  • 0
    побей меня к этому :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню