Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.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
Javascript HTML5画布图像分割_Javascript_Html_Canvas_Html5 Canvas_Image Segmentation - Fatal编程技术网

Javascript HTML5画布图像分割

Javascript HTML5画布图像分割,javascript,html,canvas,html5-canvas,image-segmentation,Javascript,Html,Canvas,Html5 Canvas,Image Segmentation,我正在尝试从图像中删除背景(墙)的白色/灰色像素,这样前景(在我的例子中是一只手)应该保留下来 我试着操纵画布像素,但前景提取不是很好,因为阴影或其他背景不一致。我甚至尝试了绿色背景,但它并没有提高性能 for (i = 0; i < imgData.width * imgData.height * 4; i += 4) { var r = imgDataNormal.data[i + 0]; var g = imgDataNormal.data[i + 1]; v

我正在尝试从图像中删除背景(墙)的白色/灰色像素,这样前景(在我的例子中是一只手)应该保留下来

我试着操纵画布像素,但前景提取不是很好,因为阴影或其他背景不一致。我甚至尝试了绿色背景,但它并没有提高性能

for (i = 0; i < imgData.width * imgData.height * 4; i += 4) {
    var r = imgDataNormal.data[i + 0];
    var g = imgDataNormal.data[i + 1];
    var b = imgDataNormal.data[i + 2];
    var a = imgDataNormal.data[i + 3];
    // compare rgb levels for green and set alphachannel to 0;
    selectedR = *a value 0 - 255*
    selectedG = *a value 0 - 255*
    selectedB = *a value 0 - 255*
    if (r <= selectedR || g >= selectedG || b <= selectedB) {
        a = 0;
    }
}
for(i=0;i如果(r=selectedG | | b代码中有一些错误:

  • 最后一行
    a=0
    除了更改局部变量外,什么也不做。您必须在数组中直接修改它
  • 之后,要查看结果,必须将像素阵列推回上下文
  • 由于(在该示例中)需要检查白色/灰色背景(
    rgb(255,255,255)
    ),因此需要检查像素的值是否较高,而不是较低。使用
    运算符而不是
    可以在此处过滤较大部分的阴影(它是灰色的,因此每个颜色分量几乎都有相同的值),而不需要去掉颜色更丰富的手
以下是一个例子:

var imgData = context.getImageData(0, 0, canvas.width, canvas.height);

for (i = 0; i < imgData.width * imgData.height * 4; i += 4) {
    var r = imgData.data[i + 0];
    var g = imgData.data[i + 1];
    var b = imgData.data[i + 2];
    var a = imgData.data[i + 3];
    // compare rgb levels for green and set alphachannel to 0;
    selectedR = 105;
    selectedG = 105;
    selectedB = 105;
    if (r >= selectedR && g >= selectedG && b >= selectedB) {
        imgData.data[i + 3] = 0;
    }
}

context.putImageData(imgData, 0, 0);
var imgData=context.getImageData(0,0,canvas.width,canvas.height);
对于(i=0;i=selectedR&g>=selectedG&b>=selectedB){
imgData.data[i+3]=0;
}
}
putImageData(imgData,0,0);
由于阴影的存在,这仍然不是完美的,但它可以工作


将像素从RGB转换为HSL,然后对像素运行阈值过滤器,以删除饱和度小于
0.12
(在
0..1
的刻度上测量饱和度-该值通过反复试验找到)的任何内容(通过将像素的alpha设置为完全透明)

JavaScript

函数rgbToHsl(r,g,b){
r/=255,g/=255,b/=255;
var max=Math.max(r,g,b),min=Math.min(r,g,b);
变量h,s,l=(最大+最小)/2;
如果(最大=最小){
h=s=0;//消色差
}否则{
var d=最大-最小值;
s=l>0.5?d/(2-最大-最小):d/(最大+最小);
开关(最大值){
案例r:h=(g-b)/d+(g返回较低值谢谢您的回答,但我已经能够实现此结果。我没有在此处包含该代码,因为它仍然无法从图像中排除阴影。是否可以细化此结果,以便仅获得手部,而不获得阴影?要消除阴影,请返回使用绿色屏幕,然后从RG转换每个像素B到HSV或HSL(常用代码)。然后使用色调值查找色调为120度的像素(+/-一点,取决于彩色遮罩的确切颜色),并排除这些像素。(阴影应调整L或V,但不影响H)如果图像源不好,则永远无法获得好的效果(戴上我的视频专业帽):确保您的图像源照明正确、清晰,并且手臂照明不足(这将消除阴影)。对于后者,请使用带有白色散流器和光源的有机玻璃。确保使用手动曝光(自动将尝试将白色减少到80%灰色)。所有光源都需要具有相同的颜色平衡。如果建议的环境可用,我不建议使用绿色屏幕,因为您将遇到颜色污染/投射。HSL=更好,但价格昂贵