我正在寻找算法(C#)或一些关于如何检测图像上某个物体边缘的信息(目标是黑色素瘤)。我找到了AForge.NET
库,但我需要检测edge without losing the image color
。以下示例使用Paint.NET
在:
后
我只需要那个蓝色边缘(里面的颜色无关紧要)或那个蓝色像素坐标
Matthew Chambers是正确的,将图像转换为灰度可以提高算法的有效性。 第一个结果图像基于原始彩色图像,第二个结果图像基于灰度图像。蓝色像素对应于HSV的值<你可以自己看出差异。谢谢m8!
答案 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
和中间结果图像:
你可以看到它并不完美,但通过稍微改进它,你会获得比使用边缘检测更强大的结果,这不是一个稳定的操作。