Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用OpenCV从图像中删除局部平均颜色_Opencv - Fatal编程技术网

如何使用OpenCV从图像中删除局部平均颜色

如何使用OpenCV从图像中删除局部平均颜色,opencv,Opencv,我有一个温和的梯度背景和尖锐的前景特征,我想检测图像。我希望在图像中找到绿色圆弧。但是,绿色圆弧相对于背景仅为绿色(它们是半透明的)。绿色弧也只有一到两个像素宽 因此,对于图像的每个像素,我想减去周围像素的平均颜色。周围的5x5或10x10像素就足够了。这应该保持前景特征相对不变,但删除软背景,然后我可以选择绿色通道进行进一步处理 有没有办法有效地做到这一点?它不需要特别精确,但我想在1080p图像上以30Hz的频率运行它 根据背景梯度的平滑程度,边缘检测和膨胀可能会对您很有效 边缘检测将输出示

我有一个温和的梯度背景和尖锐的前景特征,我想检测图像。我希望在图像中找到绿色圆弧。但是,绿色圆弧相对于背景仅为绿色(它们是半透明的)。绿色弧也只有一到两个像素宽

因此,对于图像的每个像素,我想减去周围像素的平均颜色。周围的5x5或10x10像素就足够了。这应该保持前景特征相对不变,但删除软背景,然后我可以选择绿色通道进行进一步处理

有没有办法有效地做到这一点?它不需要特别精确,但我想在1080p图像上以30Hz的频率运行它


根据背景梯度的平滑程度,边缘检测和膨胀可能会对您很有效

边缘检测将输出示例中显示的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种颜色的线。从这里开始,您可以应用颜色过滤来选择绿色。您可以通过对图像进行简单的框模糊,然后从原始图像中减去该框模糊来实现这一点:

blur(img,blurred,Size(15,15));
diff=img-blurred;
我在一张1920x1080的图像上试过这个,在一张像样的iMac上,模糊需要25毫秒,减法需要15毫秒


如果你的背景变化不快,您可以在第二个线程的几帧空间内计算模糊度,并继续重复使用它,直到几帧后重新计算它,这样您的每30帧只需进行15毫秒的减法运算,而不是45毫秒的处理。

传统方法是先模糊,然后进行减法运算。你可能会发现,如果准确度不是那么重要,你可以将图像有效地缩小到原始大小的1/4或更小,然后在更小的图像上使用更小的模糊/平均半径(这会更快),然后在减去之前将其缩小到原始大小。我没有对其进行基准测试或实现它,但是Scale2x算法看起来很有趣,并且被认为足够重要,可以包含在CImg库中。不确定您是否意识到,但是如果您从每个像素中减去周围9x9区域的平均值,您会得到颜色的失真。。。我做了一些基准测试,在我的机器上使用1920x1080图像,框模糊大约需要25ms,减法大约需要15ms,你的肯定会有所不同,但可能在单独的线程中进行框模糊,并且仅每10-30帧进行一次,除非背景变化非常快,然后你将只有15毫秒的减法时间,这在30帧的视频上可能是可以的。模糊减法效果很好,请做出正确的回答,以便我可以批准它