在belisarius的遮罩生成的一些帮助下,这是尝试实现Mark Ransom的方法的尝试:
找到对象的边界:
img1 = SetAlphaChannel[img, 1];
erosionamount=2;
mb = ColorNegate@ChanVeseBinarize[img, TargetColor -> {1., 1., 1},
"LengthPenalty" -> 10];
edge = ImageSubtract[Dilation[mb, 2], Erosion[mb, erosionamount]];
ImageApply[{1, 0, 0} &, img, Masking ->edge]
设置Alpha值:
edgealpha = ImageMultiply[ImageFilter[(1 - Mean[Flatten[#]]^5) &,
ColorConvert[img, "GrayScale"], 2, Masking -> edge], edge];
imagealpha = ImageAdd[edgealpha, Erosion[mb, erosionamount]];
img2 = SetAlphaChannel[img, imagealpha];
反向混色:
img3 = ImageApply[Module[{c, \[Alpha], bc, fc},
bc = {1, 1, 1};
c = {#[[1]], #[[2]], #[[3]]};
\[Alpha] = #[[4]];
If[\[Alpha] > 0, Flatten[{(c - bc (1 - \[Alpha]))/\[Alpha], \[Alpha]}], {0., 0.,
0., 0}]] &, img2];
Show[img3, Background -> Pink]
请注意,有些边缘有白色绒毛吗?将其与第一张图像中的红色轮廓进行比较。我们需要一个更好的边缘检测器。增加腐蚀量有助于起毛,但其他面变得太透明,因此需要权衡边缘蒙版的宽度。不过,考虑到本身没有模糊操作,这非常好。
在各种图像上运行该算法以测试其鲁棒性,以查看其自动化程度,将是有益的。