……先说结论,这问题我还是没能解决。不过姑且算是有一些收获,所以这里贴一下。
嗯……这话说出来可能有点像找借口,不过,在我看来这个照片最大的败笔就是背景上那张坐标纸,如果不是它, 这个问题已经解决了。以下是我得到的最佳结果:
img = (*你的图*);
Manipulate[partimg = ImageTake[img, {top, bottom}, {left, right}];
edges = Thinning@
DeleteSmallComponents[EdgeDetect[Closing[partimg, cr], detectr], smallnumber];
HighlightImage[partimg, edges], {left, 1, 640, 1}, {right, -1, -640, -1}, {top, 1, 480,
1}, {bottom, -1, -480, -1}, {{detectr, 3}, 2, 5}, {{cr, 1}, 0, 2}, {{smallnumber, 600},
0, 900}]

可以看到,边缘部分几乎已经被找到了,如果没有背后的坐标纸作怪的话……
简要说说上面的代码里用到的一些我自己总结的经验(全是自己的探索,可能远不是最佳的思路):
1 使用ImageTake尽可能剪除不必要的照片,这样可以使得EdgeDetect等函数更容易地找到边缘。
2 如果有大量照片需要处理的话,针对每幅照片去调节参数(剪除的幅度,EdgeDetect的侦测半径,DeleteSmallComponents删除的份量大小等等)几乎是不可避免的,即使各照片看上去差不多。当然,适当运用经验1可以使这些调整变得容易。
3 上面的代码里虽然用了Thinning但其实它至少在这里起的作用并不大。
当前我只能做到这么多了,欢迎大家继续探索……