我正在使用opencv处理c ++中的扩张问题。我已经拍摄了停车场的视频框架,为了获得最好的斑点,我想出了这个。
那么我做了什么让这个工作?首先,我需要知道这些点上的2个点(x,y)和2个良好的扩张核粒度。利用该信息,可以在整个图像上对这些值进行插值和外推。所以我根据这些参数计算了ROI(大小和扩张内核大小)。因此,每个ROI都有自己的预定义内核大小,用于扩展。请注意,两个连续的ROI(opencv矩形)之间没有任何空格。一切都很好,但有两个副作用:
我已经尝试过改变ROI大小的所有内容并在它们之间留下一些空间,但缺点是2个独立的ROI之间的blob没有扩大。
所以我的问题是:
修改
所以我找到了我的解决方案:当你调用opencv dilate函数时,需要确定是否可以将相同的cv :: Mat用作目标图像。如果没有,您将使用原始图像和新图像的一部分。所以我所要做的就是包括一个目的地cv :: Mat。
答案 0 :(得分:0)
这不能回答你的第一个问题(肯定会导致这些副作用的原因),但为了使它们消失,你可以做一些以下的变体,假设ROI参数是离散的而不是连续的(如图所示)是这样的。)
您可以使用每个可能的内核大小计算整个图像的扩张。然后,在计算完所有这些二进制图像之后,您可以将它们组合在一起,从正确的图像中获取正确的样本以获得所需的输出图像。这绝对会浪费很多时间,但它应该没有任何工件。
一旦你确认了你已经达到的结果(几乎可以保证质量尽可能好),你就可以开始尝试优化了。我尝试的一件事是扩展每个ROI大小,以便通过内核大小来计算扩张。这可能会解决可能由奇怪的边界条件引起的伪影。
这导致我猜测导致伪影的原因:无论何时拍摄有限图像并运行卷积(或形态运算符),您都需要选择对边缘像素执行的操作。通常,访问(-4,-1)处的像素是没有意义的,但是如果你的内核与它重叠,你必须执行操作符。如果OpenCV正在为您的子区域执行此边缘填充,则很容易为您提供您所看到的工件。
希望这有帮助!