我的图像具有柔和的渐变背景和我想要检测的清晰前景特征。我希望在图像中找到绿色弧线。但是,绿色弧线相对于背景仅为绿色(它们是半透明的)。绿色弧线也只有一个或两个像素宽。
因此,对于图像的每个像素,我想减去周围像素的平均颜色。周围的5x5或10x10像素就足够了。这应该使前景特征保持相对不变,但删除软背景,然后我可以选择绿色通道进行进一步处理。
有没有办法有效地做到这一点?它不一定特别准确,但我想在1080p图像上以30Hz运行它。
答案 0 :(得分:2)
您可以通过在图像上执行简单的框模糊然后从原始图像中减去它来实现此目的:
blur(img,blurred,Size(15,15));
diff=img-blurred;
我在一张1920x1080的图像上尝试了这个,模糊花了25毫秒,减法在一个不错的规格iMac上耗时15毫秒。
如果您的背景没有快速变化,您可以计算第二个线程中几帧空间的模糊,并继续重复使用它,直到您在几帧之后再次重新计算它然后您将只有15ms减法到为每个30fps而不是45ms的处理做。
答案 1 :(得分:1)
根据背景渐变的平滑程度,边缘检测然后扩张可能对您有效。
边缘检测将输出您在样本中显示的3条线并丢弃背景渐变(同样,取决于平滑度)。然后将图像拉长会使边缘变粗,使得线条轮廓更加重要。
您可以将此边缘地图叠加在原始图像上:
Mat src,edges;
//perform edge detection on src and output in edges.
Mat result;
cvtColor(edges,edges,cv2.COLOR_GRAY2BGR);//change mask to a 3 channel image
subtract(edges,src,result);
subtract(edges,result);
结果应该只包含3行3种颜色。从这里开始,您可以应用颜色过滤来选择绿色。