gpt4 book ai didi

image-processing - 如何删除 "green screen"人像背景

转载 作者:行者123 更新时间:2023-12-04 02:44:36 27 4
gpt4 key购买 nike

我正在寻找一种方法来从大量图片中自动删除(= 使透明)“绿屏”肖像背景。

到目前为止,我自己的尝试一直……嗯……不太成功。

我正在四处寻找有关该主题的任何提示、解决方案或论文。商业解决方案也很好。

在您发表评论并说不可能自动执行此操作之前:不,它不是。实际上存在一家提供这种服务的公司,如果我无法提出不同的解决方案,我们将使用它们。问题是他们用生命保护他们的算法,因此不会出售/许可他们的软件。相反,我们必须将所有图片通过 FTP 传输到处理完成的地方,然后我们将结果通过 FTP 传输回家。 (不,他们没有隐藏在菲律宾的低薪员工手动处理这个问题,因为我们每天要讨论几千张照片......)但是,由于几个原因,这种方法限制了它的实用性。所以我真的很想要一个解决方案,可以在离线时立即完成。

编辑 :我的“肖像”描绘的是有头发的人——这是一个非常棘手的部分,因为绿色背景会渗入头发。另一个棘手的部分是是否可以区分背景中的绿色和人们衣服中的相同绿色。我在上面谈论的公司声称他们可以通过确定绿色区域是否处于焦点(清晰与模糊)来做到这一点。

最佳答案

由于您没有提供任何图片,我从网上选择了一张带有色度键的图片 由于 JPEG 压缩,具有不同深浅的绿色和大量噪声 .

没有技术规范所以我用Java和Marvin Framework .

输入图像:

enter image description here

步骤 1 简单地将绿色像素转换为透明度。基本上它在 HSV 颜色空间中使用过滤规则。

enter image description here

正如您所提到的,头发和一些边界像素呈现与绿色混合的颜色。为了减少这个问题,在步骤 2 ,这些像素被过滤和平衡以减少其绿色比例。

之前:

enter image description here

之后:

enter image description here

最后,在步骤 3 ,渐变透明度应用于所有边界像素。使用高质量的图像效果会更好。

最终输出:

enter image description here

源代码:

import static marvin.MarvinPluginCollection.*;

public class ChromaToTransparency {

public ChromaToTransparency(){
MarvinImage image = MarvinImageIO.loadImage("./res/person_chroma.jpg");
MarvinImage imageOut = new MarvinImage(image.getWidth(), image.getHeight());
// 1. Convert green to transparency
greenToTransparency(image, imageOut);
MarvinImageIO.saveImage(imageOut, "./res/person_chroma_out1.png");
// 2. Reduce remaining green pixels
reduceGreen(imageOut);
MarvinImageIO.saveImage(imageOut, "./res/person_chroma_out2.png");
// 3. Apply alpha to the boundary
alphaBoundary(imageOut, 6);
MarvinImageIO.saveImage(imageOut, "./res/person_chroma_out3.png");

}

private void greenToTransparency(MarvinImage imageIn, MarvinImage imageOut){
for(int y=0; y<imageIn.getHeight(); y++){
for(int x=0; x<imageIn.getWidth(); x++){

int color = imageIn.getIntColor(x, y);
int r = imageIn.getIntComponent0(x, y);
int g = imageIn.getIntComponent1(x, y);
int b = imageIn.getIntComponent2(x, y);

double[] hsv = MarvinColorModelConverter.rgbToHsv(new int[]{color});

if(hsv[0] >= 60 && hsv[0] <= 130 && hsv[1] >= 0.4 && hsv[2] >= 0.3){
imageOut.setIntColor(x, y, 0, 127, 127, 127);
}
else{
imageOut.setIntColor(x, y, color);
}

}
}
}

private void reduceGreen(MarvinImage image){
for(int y=0; y<image.getHeight(); y++){
for(int x=0; x<image.getWidth(); x++){
int r = image.getIntComponent0(x, y);
int g = image.getIntComponent1(x, y);
int b = image.getIntComponent2(x, y);
int color = image.getIntColor(x, y);
double[] hsv = MarvinColorModelConverter.rgbToHsv(new int[]{color});

if(hsv[0] >= 60 && hsv[0] <= 130 && hsv[1] >= 0.15 && hsv[2] > 0.15){
if((r*b) !=0 && (g*g) / (r*b) >= 1.5){
image.setIntColor(x, y, 255, (int)(r*1.4), (int)g, (int)(b*1.4));
} else{
image.setIntColor(x, y, 255, (int)(r*1.2), g, (int)(b*1.2));
}
}
}
}
}

public static void main(String[] args) {
new ChromaToTransparency();
}
}

关于image-processing - 如何删除 "green screen"人像背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2810970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com