Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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
NeuQuant.js(JavaScript颜色量化)隐藏在js转换中的错误_Javascript_Neural Network_Quantization - Fatal编程技术网

NeuQuant.js(JavaScript颜色量化)隐藏在js转换中的错误

NeuQuant.js(JavaScript颜色量化)隐藏在js转换中的错误,javascript,neural-network,quantization,Javascript,Neural Network,Quantization,当图像宽度和高度为100的倍数时效果良好: 300x300 否则,显然存在一个bug: 299x300 (这些是用塑料制成的。) 我90%确信这个bug在NeuQuant.js中。我已经用和做了测试,两个编码器都有相同的错误。只有当图像大小不是100的倍数时,摄影图像(量化到256色)才明显可见 如果您了解神经网络、颜色量化和/或将AS3移植到JS的问题,请看一看。原来的搬运工已经放弃了这个项目,它离工作太近了 下面是使用OMGGIF在worker中实现它的示例: importScripts(

当图像宽度和高度为100的倍数时效果良好:

300x300

否则,显然存在一个bug:

299x300

(这些是用塑料制成的。)

我90%确信这个bug在NeuQuant.js中。我已经用和做了测试,两个编码器都有相同的错误。只有当图像大小不是100的倍数时,摄影图像(量化到256色)才明显可见

如果您了解神经网络、颜色量化和/或将AS3移植到JS的问题,请看一看。原来的搬运工已经放弃了这个项目,它离工作太近了


下面是使用OMGGIF在worker中实现它的示例:

importScripts('omggif.js','NeuQuant.js');
var rgba2rgb=函数(数据){
var像素=[];
var计数=0;
var len=data.length;
对于(var i=0;i>=netbiashift;
网络[i][1]>>=netbiashift;
网络[i][2]>>=netbiashift;
网络[i][3]=i;/*记录颜色编号*/
}
}
/*
*通过预先计算的alpha*(1-((i-j)^2/[r]^2))移动相邻神经元
*无线电功率
* ---------------------------------------------------------------------------------
*/
var alterneigh=函数alterneigh(rad/*int*/,i/*int*/,b/*int*/,g/*int*/,r/*int*/)/*void*/
{
var j/*int*/;
变量k/*int*/;
var lo/*int*/;
var hi/*int*/;
var a/*int*/;
var m/*int*/;
var p/*数组*/;
lo=i-rad;
如果(lo<-1)lo=-1;
hi=i+rad;
如果(hi>netsize)hi=netsize;
j=i+1;
k=i-1;
m=1;
而((jlo))
{
a=辐射功率[m++];
如果(jlo)
{
p=网络[k--];
尝试
{
p[0]=(a*(p[0]-b))/alpharadbias;
p[1]=(a*(p[1]-g))/alpharadbias;
p[2]=(a*(p[2]-r))/alpharadbias;
}捕获(e/*错误*/){}
}
}
}
/*
*通过因子α将神经元i移向偏置(b,g,r)
* ----------------------------------------------------
*/
var altersingle=函数altersingle(alpha/*int*/,i/*int*/,b/*int*/,g/*int*/,r/*int*/)/*void*/
{
/*改变击中神经元*/
var n/*数组*/=网络[i];
n[0]=(α*(n[0]-b))/initalpha;
n[1]=(α*(n[1]-g))/initalpha;
n[2]=(α*(n[2]-r))/initalpha;
}
/*
*搜索有偏差的BGR值----------------------------
*/
变量竞赛=函数竞赛(b/*int*/,g/*int*/,r/*int*/)/*int*/
{
/*查找最近的神经元(最小距离)并更新频率*/
/*找到最佳神经元(最小距离偏差)并返回位置*/
/*对于频繁选择的神经元,freq[i]较高,bias[i]为负*/
/*偏差[i]=伽马*((1/netsize)-freq[i])*/
var i/*int*/;
var dist/*int*/;
var a/*int*/;
var biasdist/*int*/;
变量betafreq/*int*/;
var bestpos/*int*/;
var bestbiaspos/*int*/;
var bestd/*int*/;
var bestbiasd/*int*/;
var n/*数组*/;
bestd=~(1>(intbiasshift-netbiasshift));
if(biasdist>betashift);
freq[i]=betafreq;

bias[i]+=(betafreqJavaScript代码似乎忽略了C在将运算结果赋给整数变量之前先用十进制数截断运算结果。因此,
int i=5/2;
对于C是
2
,但是
var i=5/2;
对于JavaScript是
2.5

他说,改变这一行:

delta = samplepixels / ncycles;
致:

这解决了这个问题,但我不清楚这个更改是解决了所有可能的整数转换问题,还是只解决了问题中暴露的问题


请注意,我使用了按位OR运算符来截断结果。这是JavaScript中截断数字的一种经典方法,因为按位运算符将其操作数视为32位整数。

我花了几天时间才发现这个微妙的错误。问题不限于JavaScript实现,C/C++和C#版本都有它也是。错误在于学习过程中像素采样的方式。代码使用四个素数中的一个,499、491、487和503。例如,如果图像是500x499,它选择491,像素采样非常均匀,如下所示(红色点是采样像素):

现在,对于500x500图像,选择了499,采样非常糟糕:

我去掉了所有的素数废话,使用了一个很好的旧随机数生成器:

    int step = ((float)rand() / (float)RAND_MAX) * lengthcount;
    if( step >= lengthcount )
        step = lengthcount - 1;
    p = thepicture + step;

适用于任何图像大小!

原版:可能有一种黑客解决方案,为颜色量化构建一个%100==0像素阵列,然后再次对其进行裁剪以进行GIF编码…原始帧来自何处?您确定步幅等于
宽度*大小(像素)
?例如,如果您有一个32位RGBA帧,其跨距要求为8字节的倍数,则299像素行将占据
四舍五入(299*4/8)*8
=
1200
字节。也就是说,每行将包含4个字节的填充。如果是这种情况,您必须让量化器考虑填充。@Michael我正在从html画布获取图像数据,并将画布的RGBA转换为NeuQuant期望的RGB数组。不确定您的点是否会在JS版本,因为
    int step = ((float)rand() / (float)RAND_MAX) * lengthcount;
    if( step >= lengthcount )
        step = lengthcount - 1;
    p = thepicture + step;