一种无颜色丢失的边缘检测算法

时间:2012-01-07 20:47:40

标签: c# image-processing

我正在寻找算法(C#)或一些关于如何检测图像上某个物体边缘的信息(目标是黑色素瘤)。我找到了AForge.NET库,但我需要检测edge without losing the image color。以下示例使用Paint.NET

准备

在:

enter image description here

enter image description here

我只需要那个蓝色边缘(里面的颜色无关紧要)或那个蓝色像素坐标

修改

Matthew Chambers是正确的,将图像转换为灰度可以提高算法的有效性。 第一个结果图像基于原始彩色图像,第二个结果图像基于灰度图像。蓝色像素对应于HSV的值<你可以自己看出差异。谢谢m8!

enter image description here

4 个答案:

答案 0 :(得分:3)

您需要考虑与您尝试解决的问题相关的几点。

图片的边缘是什么?通常是当颜色以高速率变化时。即在短暂的空间里从黑暗到光明。

但这有一个关于颜色的实际变化率是多少的问题。例如,红色和绿色值可以保持不变,而蓝色值则以高速率变化。我们会把这算作一个优势吗?对于RGB值的任何组合都可能发生这种情况。

出于这个原因,图像通常会转换为灰度以进行边缘检测 - 否则您可能会为每个RGB值获得不同的边缘结果。

出于这个原因,最简单的方法是使用适用于灰度图像的典型边缘检测算法,然后将结果叠加到原始图像上。

答案 1 :(得分:1)

如何使用Edges类:

// create filter
Edges filter = new Edges();
// apply the filter
var newImage = filter.Apply(orignalImage);

然后对newImages执行threshold,最后在newImage之上覆盖originalImage

答案 2 :(得分:1)

您可以转换为Lab色彩空间,分割通道,仅在L通道上运行边缘检测代码(如其他答案中提供的代码),然后添加a和b通道。

答案 3 :(得分:1)

考虑到图像和问题,看起来您不需要边缘检测 我会使用自适应阈值技术,找到blob并最终从中提取边缘。

以下是Matlab中的代码,用于说明我的意思:

function FindThresh()
    i = imread('c:\b.png');
    figure;imshow(i);
    graythresh(i)
    th = graythresh(i(:,:,2))*255;
    figure;imshow(i(:,:,2)>th)
    i1 = imclose(i(:,:,2)>th,strel('diamond',3));
    figure;imshow(i1)
    e = edge(i1);
    indexes = find(e);
    [r,c]=ind2sub(size(i1),indexes)

    figure;imshow(e)
    figure;imshow(i);hold on; scatter(c,r);
end

和中间结果图像:

The figures

你可以看到它并不完美,但通过稍微改进它,你会获得比使用边缘检测更强大的结果,这不是一个稳定的操作。