在我的项目中,我需要检测边缘进行形状检测。目前我正在使用MATLAB,但如果openCV能提供更好的输出,我对它感到满意。所以问题来了。我的样本图像有重叠的物体与粗糙的表面。我正在使用这个代码并获得良好的输出,但表面的粗糙度仍然使我的输出下降。我在MATLAB中有趣的代码:
a = imread('D:imageswheatstarch.jpg');
I = rgb2gray(a);
imshow(I)
thresold = graythresh(I);
se1=strel('diamond',2);
I1=imerode(I,se1);
bw = edge(I1,'canny');
figure;
imshow(bw);
我得到了以下输出:http://i49.tinypic.com/vg7fns.png
我需要一个更好的输出,这样我就可以用这个输出进行形状检测。
要下载的输入图像http://www.profimedia.si/photo/wheat-starch-granules/profimedia-0035237439.jpg
在photoshop中播放文件时,photoshop find edges edgess后面跟着一个levels命令,可以得到更像您想要的输出。我并不是建议你使用photoshop,photoshop是一个方便的工具,可以可视化处理图形文件的方法。我总是自己编写代码,所以不能建议任何现成的解决方案。
我看到的是photoshop的find edges给出了边缘硬度的灰度结果,而你要找的对象是边缘最硬的对象。
看起来你得到的是首先转换为b&w(类似于level命令),然后找到边。转换为b&w在阴影中创建任意线条,然后对其进行跟踪。这导致了原始图像中出现的阴影中的灰度平滑过渡到跟踪中的人造线。
通过创建灰度边缘,然后将灰度边缘转换为b&w、 灰色的平滑移动不会产生任何边缘。
您最好看看BSDS,它们具有最先进的边缘检测功能,应该比Canny性能更好
它们还有源代码(为Linux编译的matlab)。