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