只要您使用二进制图像(如您提供的二进制图像),形态过滤就会很好。扩大图像然后减去原始图像。
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);
最终你想要编辑图像的像素。 Marc Gravell已经在这里回答了这个问题。
然后,根据您选择的选项LockBits或GetPixel / SetPixel,您需要循环查看每像素颜色值。保持循环直到你碰到一个白色像素。
完成后,检查周围的所有方向,如果找到黑色像素,则将该白色像素的颜色设置为红色。这当然是最简单的答案,并且有一些方法可以优化它,但它会起作用。
例如,如果您想将颜色更改为仅限于四个直接相邻的像素,则可以,而不是检查对角线。
边缘检测?图像处理? OpenCV! lib有C#包装器。不是“简单”的解决方案,但是使用此lib获得的任何exp都是一个很好的简历构建器。如果你的公司正在进行图像处理,他们可能已经在使用它。
快速而肮脏的解决方逐个像素地运行图像,如果颜色发生变化,只需将像素涂成红色即可。
PS:注意这可能不适用于正方形,除非你在垂直和水平方向上做同样的事情
你几乎肯定想要使用Canny Edge Detector,它应该能够很容易地做到这一点。 My company的产品系列包括这样一个工具,这是运行它的输出:alt text http://www.plinth.org/_images/image1Output.gif
您正在寻找的是边缘检测。您可以在Google上找到适用于常规算法的大量资源:
我至少可以指向一些漂亮的边缘检测滤波器:http://www.codeproject.com/KB/GDI-plus/edge_detection.aspx
我想它应该适合你
从来没有做过这样的事情,但是复杂图像处理的强大工具是:
http://www.imagemagick.org/script/index.php
大量文档和示例 - 如果您不想调用可执行文件,还需要.NET包装器。
有趣的问题 - 我假设你的例子中的'白色圆圈'实际上是另一个图像 - 这意味着你不是自己画圆圈的?
如果是这样,您可以扫描所有像素以找到至少在其一侧具有黑色的白色像素(4个方向或8个包括角)。如果匹配则将其交换为红色。如果没有,那么忽略它。
我怀疑这是最好的方法,但如果它只是黑色和白色,这可能会让你开始。
这有几种方法。
第一个是: - 你知道有一个圆圈,你需要找到中心的位置和半径。所以你可以使用Hough transformation来找到这些,然后用红色绘制你的圆圈。阅读this topic或this one