首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用OpenCV从图像中去除局部平均颜色

如何用OpenCV从图像中去除局部平均颜色
EN

Stack Overflow用户
提问于 2016-11-05 10:33:42
回答 2查看 2.4K关注 0票数 1

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

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

有什么办法能有效地做到这一点吗?它不一定要特别准确,但我想在1080 p图像上运行30 on。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-06 12:04:18

您可以通过在图像上做一个简单的方框模糊,然后从原始图像中减去它:

代码语言:javascript
复制
blur(img,blurred,Size(15,15));
diff=img-blurred;

我在一张1920x1080的图片上尝试了这个,模糊图像花费了25毫秒,在一个像样的规格iMac上减去了15毫秒。

如果你的背景变化不快,你可以在第二个线程中计算出几个帧空间上的模糊值,然后继续重复使用它,直到你在几个帧之后再重新计算它,那么你只能对你的30 for中的每一个帧进行15 is的减法,而不是45 is的处理。

票数 2
EN

Stack Overflow用户

发布于 2016-11-05 13:24:44

根据背景梯度的平滑程度,边缘检测和扩张可能对你很好。

边缘检测将输出你在样本中显示的3行,并丢弃背景梯度(同样,取决于平滑度)。膨胀的图像,然后将加厚的边缘,使您的线条轮廓更重要。

您可以将此边缘地图叠加到原始图像上,如下所示:

代码语言:javascript
复制
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种颜色的线条。从现在开始,您可以应用颜色过滤来选择绿色的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40437181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档