急急_挖背景问题:能不能将人之外的每个像素挖掉或者直接清除?
processing吧
全部回复
仅看楼主
level 4
义海涵言 楼主
挖背景问题:能不能将人之外的每个像素挖掉或者清除?只想留住人,其他透明或者挖掉。
怎么将img图片中的人留住,其余挖掉成透明。
图中绿色去掉
(img 图片)
for (int x = 0; x < img.width; x ++ ) {
for (int y = 0; y < img.height; y ++ ) {
int loc = x + y*iimg.width; // Step 1, 1D位置是什么
color fgColor = img.pixels[loc]; // Step 2, 前景色是什么
color bgColor = backgroundImage.pixels[loc]; // Step 3, 背景色是什么
float r1 = red(fgColor);
float g1 = green(fgColor);
float b1 = blue(fgColor);
float r2 = red(bgColor);
float g2 = green(bgColor);
float b2 = blue(bgColor);
float diff = dist(r1,g1,b1,r2,g2,b2);
if (diff > 30) {
// 如果是,显示前景色
pixels[loc] = fgColor;
} else {
// 如果不是,显示绿色
//注:想将绿色改为 透明或者挖掉,怎么办啊?球帮忙
pixels[loc] = color(0,255,0); //
}
}
}
updatePixels();
2016年04月17日 03点04分 1
level 8
pixels[loc] = color(0,0,0,0);
2016年04月17日 12点04分 2
刚采用你的方法,发现替换后的像素变黑了,这是为什么?我已经把程序发到我的回复,再次麻烦看下是不是我那里错了。
2016年04月17日 15点04分
@义海涵言 没错吧,可能是我这方法有问题。还有,我认为不可能出现某个像素完全透明
2016年04月18日 00点04分
@灾难之高数 我用其他不透明的png格式图片作为pixels[loc] = color(0,0,0,0);的替换,可以实现背景替换,但如果png自带透明将pixels[loc] = color(0,0,0,0)替换,透明部分就默认白色,这几天弄这个头都大了。谢谢你一直的指导,我再想想办法。[太开心]
2016年04月18日 08点04分
level 4
义海涵言 楼主
我想把人这外的像素抠掉,采用 楼上的办法pixels[loc] = color(0,0,0,0); 抠掉部分就变成黑色,想形成一张类似png格式的图片,只留住人,透明化的像素可以透过看到背景颜色 红色 background(225,0,0);
(参考如下程序)
抠图前
抠图后
// 点击鼠标以记录当前背景图像
import codeanticode.gsvideo.*;
// 捕捉设备的变量
GSCapture video;
// 保存背景
PImage backgroundImage;
// 差异有多大才能将一个像素作为前景像素
float threshold = 18;
void setup() {
size(1280,720);
video = new GSCapture(this, width, height);
backgroundImage = createImage(video.width,video.height,RGB);
video.start();
}
void draw() {
// 捕捉视频
background(225,0,0);
if (video.available()== true) {
video.read();
}
loadPixels();
video.loadPixels();
backgroundImage.loadPixels();
// 开始在每个像素间循环
for (int x = 0; x < video.width; x ++ ) {
for (int y = 0; y < video.height; y ++ ) {
int loc = x + y*video.width; // Step 1, 1D位置是什么
color fgColor = video.pixels[loc]; // Step 2, 前景色是什么
color bgColor = backgroundImage.pixels[loc]; // Step 3, 背景色是什么
// Step 4, compare the foreground and background color
float r1 = red(fgColor);
float g1 = green(fgColor);
float b1 = blue(fgColor);
float r2 = red(bgColor);
float g2 = green(bgColor);
float b2 = blue(bgColor);
float diff = dist(r1,g1,b1,r2,g2,b2);
// Step 5, 前景色相比背景色显得不同吗
if (diff > threshold) {
// 如果是,显示前景色
pixels[loc] = fgColor;
} else {
// 如果不是,显示绿色
//注:采用color(0,0,0,0);后,怎么会变黑了??
//注:采用color(0,0,0,0);后,怎么会变黑了??
pixels[loc] = color(0,0,0,0); // 像素透明化
}
}
}
updatePixels();
}
void mousePressed() {
backgroundImage.copy(video,0,0,video.width,video.height,0,0,video.width,video.height);
backgroundImage.updatePixels();
}
2016年04月17日 15点04分 3
level 8
背景色先写到栈里,后画人。你那样该背景色会覆盖前面的花和人
2016年04月30日 15点04分 4
要不就是一张图上拾取了所有同种色素该色造成的
2016年04月30日 15点04分
level 8
我做过类似 的项目,有两种实现办法
2016年05月10日 05点05分 5
1