function copyMakeBorder_8U(__src, __top, __left, __bottom, __right, __borderType){
var i, j;
var 너비 = __src.col,
높이 = __src.row;
var top = __top,
left = __left || __상단,
오른쪽 = __오른쪽 || 왼쪽,
하단 = __bottom || 상단,
dstWidth = 너비 왼쪽 오른쪽,
dstHeight = 높이 상단 하단,
borderType = borderType || CV_BORDER_REFLECT;
var buffer = new ArrayBuffer(dstHeight * dstWidth * 4),
tab = new Uint32Array(왼쪽 오른쪽);
for(i = 0; i tab[i] = borderInterpolate(i - 왼쪽, 너비, __borderType);
}
for(i = 0; i < right; i ){
tab[i left] = borderInterpolate(width i, width, __borderType);
}
var tempArray, 데이터;
for(i = 0; i tempArray = new Uint32Array(buffer, (i top) * dstWidth * 4, dstWidth);
data = new Uint32Array(__src.buffer, i * 너비 * 4, 너비);
for(j = 0; j tempArray[j] = data[tab[j]];
for(j = 0; j tempArray[j 너비 왼쪽] = data[tab[j 왼쪽]];
tempArray.set(데이터, 왼쪽);
}
var allArray = new Uint32Array(버퍼);
for(i = 0; i j = borderInterpolate(i - top, height, __borderType);
tempArray = new Uint32Array(buffer, i * dstWidth * 4, dstWidth);
tempArray.set(allArray.subarray((j top) * dstWidth, (j top 1) * dstWidth));
}
for(i = 0; i < Bottom; i ){
j = borderInterpolate(i height, height, __borderType);
tempArray = new Uint32Array(buffer, (i 상단 높이) * dstWidth * 4, dstWidth);
tempArray.set(allArray.subarray((j top) * dstWidth, (j top 1) * dstWidth));
}
return new Mat(dstHeight, dstWidth, new Uint8ClampedArray(buffer));
}
这里需要解释下, 边缘的复顺序是:先对每行的左右进行扩話,然后在此基础上进行上下扩試,如图所示。
저희는 ArrayBuffer의 특성을 이용하여 ArrayBuffer의 성능을 향상시켰습니다.点了。什么의미思?
比如对于某个image素点: RGBA, 由于某个通道是用无符号8为整数来存储的, 所以实际一个 Image 素点则对应了32位的存储大小, 由于ArrayBuffer 性质,可以将数据转成任意类型来处理,这样우리는 Uint32Array类型,将数据变成每个image素点的数据数组。
那么copyConstBorder_8U就比较容易实现了:
function copyMakeConstBorder_8U(__src, __top, __left, __bottom, __right, __value){
var i, j;
var 너비 = __src.col,
높이 = __src.row;
var top = __top,
left = __left || __상단,
오른쪽 = __오른쪽 || 왼쪽,
하단 = __bottom || 상단,
dstWidth = 너비 왼쪽 오른쪽,
dstHeight = 높이 상단 하단,
value = __value || [0, 0, 0, 255];
var constBuf = new ArrayBuffer(dstWidth * 4),
constArray = new Uint8ClampedArray(constBuf);
버퍼 = new ArrayBuffer(dstHeight * dstWidth * 4);
for(i = 0; i for( j = 0; j constArray[i * 4 j] = value[j];
}
}
constArray = new Uint32Array(constBuf);
var tempArray;
for(i = 0; i tempArray = new Uint32Array(buffer, (i top) * dstWidth * 4, left);
tempArray.set(constArray.subarray(0, 왼쪽));
tempArray = new Uint32Array(buffer, ((i top 1) * dstWidth - right) * 4, right);
tempArray.set(constArray.subarray(0, 오른쪽));
tempArray = new Uint32Array(buffer, ((i top) * dstWidth left) * 4, width);
tempArray.set(new Uint32Array(__src.buffer, i * width * 4, width));
}
for(i = 0; i < top; i ){
tempArray = new Uint32Array(buffer, i * dstWidth * 4, dstWidth);
tempArray.set(constArray);
}
for(i = 0; i < Bottom; i ){
tempArray = new Uint32Array(buffer, (i 상단 높이) * dstWidth * 4, dstWidth);
tempArray.set(constArray);
}
return new Mat(dstHeight, dstWidth, new Uint8ClampedArray(buffer));
}
效果图
CV_BORDER_REPLICATE
CV_BORDER_REFLECT
CV_BORDER_WRAP
CV_BORDER_CONSTANT