我正在研究适用于Windows 8的台式电脑照片软件 . 我希望能够通过色度键控从照片中删除绿色背景 .
我是图像处理的初学者,我发现了一些很酷的链接(比如http://www.quasimondo.com/archives/000615.php),但是我不能用c#代码转换它 .
我正在使用网络摄像头(使用aforge.net)查看预览并拍照 . 我尝试了彩色滤镜,但绿色背景并没有起作用 .
如何在C#中正确地做到这一点?
我正在研究适用于Windows 8的台式电脑照片软件 . 我希望能够通过色度键控从照片中删除绿色背景 .
我是图像处理的初学者,我发现了一些很酷的链接(比如http://www.quasimondo.com/archives/000615.php),但是我不能用c#代码转换它 .
我正在使用网络摄像头(使用aforge.net)查看预览并拍照 . 我尝试了彩色滤镜,但绿色背景并没有起作用 .
如何在C#中正确地做到这一点?
3 回答
它会工作,即使背景不统一,你只需要适当的策略,足以 grab 你的所有绿屏而不更换任何其他东西 .
由于链接页面上至少有一些链接已经死亡,我尝试了自己的方法:
基础知识很简单:将图像像素的颜色与某个参考值进行比较,或应用其他一些公式来确定它是否应该透明/替换 .
最基本的公式将涉及“确定绿色是否是最大 Value ”这样简单的事情 . 虽然这适用于非常基本的场景,但它可以搞砸你(例如白色或灰色也会被过滤) .
我使用一些简单的示例代码玩弄了一下 . 当我使用Windows Forms时,它应该是可移植的而没有问题,我很确定你能够解释代码 . 请注意,这不一定是执行此操作的最佳方式 .
我使用了example image from Wikipedia并获得了以下结果:
请注意,您可能需要不同的阈值(在上面的代码中为
8
和96
),您甚至可能希望使用不同的术语来确定是否应该替换某些像素 . 您还可以在帧之间添加平滑,混合(绿色差异较小)等,以减少硬边缘 .我对我来说有点慢 . 我找了一个不同的解决方案,我找到了一个在这里使用更有效的方法的项目 . Github postworthy GreenScreen
该项目需要一个文件夹并处理所有文件,我只需要一个图像所以我这样做:
不要忘记丢弃输入位图并返回此方法 . 如果需要保存图像,只需使用位图的保存指令 .
在这里,您可以找到更快地处理图像的方法 . Fast Image Processing in C#
照片上的Chromakey应采用模拟输入 . 在现实世界中,确切的值非常罕见 .
你怎么补偿这个?在色调和色调方面围绕您选择的绿色提供阈值 . 此阈值(包括)内的任何颜色都应替换为您选择的背景;透明可能是最好的 . 在第一个链接中,Mask In和Mask Out参数实现了这一点 . 前后模糊参数尝试使背景更均匀,以减少编码噪声副作用,以便您可以使用更窄(首选)的阈值 .
为了提高性能,您可能需要编写一个像素着色器来将“绿色”切换为透明,但这是在您使其工作之后的一个考虑因素 .