image-js 0.35.1 → 0.35.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +99 -35
- package/lib/browser/environment.js +0 -6
- package/lib/browser/worker/extend.js +0 -3
- package/lib/browser/worker/process/background.js +0 -12
- package/lib/browser/worker/worker.js +0 -17
- package/lib/image/Image.js +18 -51
- package/lib/image/compute/colorHistogram.js +0 -8
- package/lib/image/compute/countAlphaPixels.js +0 -3
- package/lib/image/compute/extendedPoints.js +2 -7
- package/lib/image/compute/histogram.js +6 -25
- package/lib/image/compute/localMaxima.js +2 -10
- package/lib/image/compute/max.js +0 -5
- package/lib/image/compute/mean.js +0 -4
- package/lib/image/compute/median.js +0 -4
- package/lib/image/compute/min.js +0 -5
- package/lib/image/compute/minimalBoundingRectangle.js +5 -18
- package/lib/image/compute/moment.js +0 -3
- package/lib/image/compute/monotoneChainConvexHull.js +0 -3
- package/lib/image/compute/points.js +0 -3
- package/lib/image/compute/relativePosition.js +2 -8
- package/lib/image/compute/sum.js +0 -5
- package/lib/image/core/bitMethods.js +0 -11
- package/lib/image/core/checkProcessable.js +0 -13
- package/lib/image/core/environment.js +0 -8
- package/lib/image/core/export.js +0 -38
- package/lib/image/core/extend.js +0 -13
- package/lib/image/core/getRGBAData.js +0 -15
- package/lib/image/core/kind.js +4 -28
- package/lib/image/core/kindNames.js +1 -0
- package/lib/image/core/load.js +1 -53
- package/lib/image/core/mediaTypes.js +0 -2
- package/lib/image/core/valueMethods.js +0 -13
- package/lib/image/extend.js +7 -83
- package/lib/image/filter/abs.js +0 -3
- package/lib/image/filter/add.js +2 -8
- package/lib/image/filter/background.js +0 -9
- package/lib/image/filter/blurFilter.js +0 -6
- package/lib/image/filter/divide.js +0 -8
- package/lib/image/filter/flipX.js +0 -5
- package/lib/image/filter/flipY.js +0 -4
- package/lib/image/filter/gaussianFilter.js +0 -5
- package/lib/image/filter/gradientFilter.js +0 -10
- package/lib/image/filter/hypotenuse.js +0 -13
- package/lib/image/filter/invert.js +0 -9
- package/lib/image/filter/level.js +1 -19
- package/lib/image/filter/medianFilter.js +0 -15
- package/lib/image/filter/multiply.js +0 -10
- package/lib/image/filter/scharrFilter.js +0 -4
- package/lib/image/filter/sobelFilter.js +0 -4
- package/lib/image/filter/subtract.js +0 -8
- package/lib/image/filter/subtractImage.js +0 -10
- package/lib/image/internal/checks.js +1 -9
- package/lib/image/internal/clamp.js +0 -1
- package/lib/image/internal/copy.js +0 -2
- package/lib/image/internal/copyAlphaChannel.js +0 -1
- package/lib/image/internal/getImageParameters.js +0 -1
- package/lib/image/internal/getOutputImage.js +1 -13
- package/lib/image/model/model.js +1 -1
- package/lib/image/morphology/blackHat.js +0 -5
- package/lib/image/morphology/close.js +0 -5
- package/lib/image/morphology/dilate.js +0 -40
- package/lib/image/morphology/erode.js +0 -40
- package/lib/image/morphology/morphologicalGradient.js +0 -5
- package/lib/image/morphology/open.js +0 -5
- package/lib/image/morphology/topHat.js +0 -5
- package/lib/image/operator/cannyEdge.js +0 -3
- package/lib/image/operator/convolution.js +9 -34
- package/lib/image/operator/convolutionSeparable.js +0 -10
- package/lib/image/operator/extract.js +4 -13
- package/lib/image/operator/floodFill.js +2 -15
- package/lib/image/operator/getSeparatedKernel.js +0 -2
- package/lib/image/operator/paintLabels.js +8 -19
- package/lib/image/operator/paintMasks.js +2 -12
- package/lib/image/operator/paintPoints.js +0 -9
- package/lib/image/operator/paintPolygon.js +1 -15
- package/lib/image/operator/paintPolygons.js +2 -6
- package/lib/image/operator/paintPolyline.js +0 -7
- package/lib/image/operator/paintPolylines.js +1 -5
- package/lib/image/roi/Roi.js +27 -207
- package/lib/image/roi/RoiLayer.js +1 -22
- package/lib/image/roi/RoiMap.js +5 -38
- package/lib/image/roi/creator/fromMask.js +4 -22
- package/lib/image/roi/creator/fromMaskConnectedComponentLabelingAlgorithm.js +2 -20
- package/lib/image/roi/creator/fromMaxima.js +10 -43
- package/lib/image/roi/creator/fromPoints.js +2 -10
- package/lib/image/roi/creator/fromWaterShed.js +6 -17
- package/lib/image/roi/feretDiameters.js +9 -21
- package/lib/image/roi/manager.js +30 -119
- package/lib/image/roi/util/commonBorderLength.js +5 -16
- package/lib/image/roi/util/mergeRoi.js +2 -21
- package/lib/image/transform/cmyk.js +0 -9
- package/lib/image/transform/colorDepth.js +0 -12
- package/lib/image/transform/crop.js +0 -20
- package/lib/image/transform/cropAlpha.js +0 -11
- package/lib/image/transform/grey.js +0 -16
- package/lib/image/transform/greyAlgorithms.js +1 -24
- package/lib/image/transform/hsl.js +0 -16
- package/lib/image/transform/hsv.js +0 -15
- package/lib/image/transform/insert.js +0 -6
- package/lib/image/transform/mask/huang.js +3 -18
- package/lib/image/transform/mask/intermodes.js +3 -14
- package/lib/image/transform/mask/isodata.js +0 -14
- package/lib/image/transform/mask/li.js +12 -42
- package/lib/image/transform/mask/mask.js +1 -13
- package/lib/image/transform/mask/maxEntropy.js +8 -25
- package/lib/image/transform/mask/mean.js +1 -3
- package/lib/image/transform/mask/minError.js +10 -21
- package/lib/image/transform/mask/minimum.js +0 -20
- package/lib/image/transform/mask/moments.js +4 -17
- package/lib/image/transform/mask/otsu.js +1 -7
- package/lib/image/transform/mask/percentile.js +0 -8
- package/lib/image/transform/mask/renyiEntropy.js +8 -34
- package/lib/image/transform/mask/shanbhag.js +8 -25
- package/lib/image/transform/mask/thresholdAlgorithms.js +1 -17
- package/lib/image/transform/mask/triangle.js +13 -29
- package/lib/image/transform/mask/yen.js +2 -14
- package/lib/image/transform/pad.js +0 -20
- package/lib/image/transform/resize/nearestNeighbor.js +0 -6
- package/lib/image/transform/resize/resize.js +0 -16
- package/lib/image/transform/rgba.js +0 -9
- package/lib/image/transform/rgba8.js +0 -3
- package/lib/image/transform/rotate.js +0 -29
- package/lib/image/transform/rotateFree.js +0 -31
- package/lib/image/transform/warping.js +2 -35
- package/lib/image/utility/combineChannels.js +0 -11
- package/lib/image/utility/getBestMatch.js +2 -13
- package/lib/image/utility/getChannel.js +0 -10
- package/lib/image/utility/getClosestCommonParent.js +6 -23
- package/lib/image/utility/getColumn.js +0 -4
- package/lib/image/utility/getIntersection.js +2 -18
- package/lib/image/utility/getMatrix.js +0 -7
- package/lib/image/utility/getPixelsArray.js +0 -5
- package/lib/image/utility/getPixelsGrid.js +0 -11
- package/lib/image/utility/getRow.js +0 -4
- package/lib/image/utility/getSimilarity.js +3 -17
- package/lib/image/utility/getThreshold.js +0 -4
- package/lib/image/utility/setBorder.js +0 -16
- package/lib/image/utility/setChannel.js +0 -6
- package/lib/image/utility/setMatrix.js +0 -6
- package/lib/image/utility/split.js +2 -15
- package/lib/index.js +0 -12
- package/lib/kernel/kernel.js +0 -3
- package/lib/kernel/laplacianOfGaussian.js +1 -7
- package/lib/node_modules/test/binary.js +0 -3
- package/lib/node_modules/test/oneRoi.js +0 -2
- package/lib/stack/Stack.js +2 -35
- package/lib/stack/compute/histogram.js +0 -4
- package/lib/stack/compute/histograms.js +0 -4
- package/lib/stack/compute/max.js +0 -3
- package/lib/stack/compute/median.js +0 -4
- package/lib/stack/compute/min.js +0 -3
- package/lib/stack/extend.js +1 -11
- package/lib/stack/transform/matchAndCrop.js +6 -19
- package/lib/stack/utility/averageImage.js +0 -9
- package/lib/stack/utility/maxImage.js +0 -7
- package/lib/stack/utility/minImage.js +0 -7
- package/lib/util/Shape.js +3 -40
- package/lib/util/base64.js +3 -14
- package/lib/util/channel.js +1 -35
- package/lib/util/color.js +1 -25
- package/lib/util/converter.js +1 -13
- package/lib/util/deepValue.js +0 -3
- package/lib/util/histogram.js +1 -12
- package/lib/util/kernel.js +2 -12
- package/lib/util/matrix.js +0 -13
- package/lib/util/points.js +12 -35
- package/lib/util/value.js +0 -7
- package/lib/util/zerosMatrix.js +0 -3
- package/package.json +2 -2
- package/src/image/operator/paintLabels.js +6 -6
- package/src/image/operator/paintPolygon.js +1 -1
- package/src/image/operator/paintPolygons.js +2 -2
- package/src/image/operator/paintPolylines.js +1 -1
|
@@ -4,15 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = split;
|
|
7
|
-
|
|
8
7
|
var _Stack = _interopRequireDefault(require("../../stack/Stack"));
|
|
9
|
-
|
|
10
8
|
var _Image = _interopRequireDefault(require("../Image"));
|
|
11
|
-
|
|
12
9
|
var _model = require("../model/model");
|
|
13
|
-
|
|
14
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
11
|
/**
|
|
17
12
|
* @memberof Image
|
|
18
13
|
* @instance
|
|
@@ -26,15 +21,14 @@ function split(options = {}) {
|
|
|
26
21
|
} = options;
|
|
27
22
|
this.checkProcessable('split', {
|
|
28
23
|
bitDepth: [8, 16]
|
|
29
|
-
});
|
|
24
|
+
});
|
|
30
25
|
|
|
26
|
+
// split will always return a stack of images
|
|
31
27
|
if (this.components === 1) {
|
|
32
28
|
return new _Stack.default([this.clone()]);
|
|
33
29
|
}
|
|
34
|
-
|
|
35
30
|
let images = new _Stack.default();
|
|
36
31
|
let data = this.data;
|
|
37
|
-
|
|
38
32
|
if (this.alpha && preserveAlpha) {
|
|
39
33
|
for (let i = 0; i < this.components; i++) {
|
|
40
34
|
let newImage = _Image.default.createFrom(this, {
|
|
@@ -42,14 +36,11 @@ function split(options = {}) {
|
|
|
42
36
|
alpha: true,
|
|
43
37
|
colorModel: _model.GREY
|
|
44
38
|
});
|
|
45
|
-
|
|
46
39
|
let ptr = 0;
|
|
47
|
-
|
|
48
40
|
for (let j = 0; j < data.length; j += this.channels) {
|
|
49
41
|
newImage.data[ptr++] = data[j + i];
|
|
50
42
|
newImage.data[ptr++] = data[j + this.components];
|
|
51
43
|
}
|
|
52
|
-
|
|
53
44
|
images.push(newImage);
|
|
54
45
|
}
|
|
55
46
|
} else {
|
|
@@ -59,16 +50,12 @@ function split(options = {}) {
|
|
|
59
50
|
alpha: false,
|
|
60
51
|
colorModel: _model.GREY
|
|
61
52
|
});
|
|
62
|
-
|
|
63
53
|
let ptr = 0;
|
|
64
|
-
|
|
65
54
|
for (let j = 0; j < data.length; j += this.channels) {
|
|
66
55
|
newImage.data[ptr++] = data[j + i];
|
|
67
56
|
}
|
|
68
|
-
|
|
69
57
|
images.push(newImage);
|
|
70
58
|
}
|
|
71
59
|
}
|
|
72
|
-
|
|
73
60
|
return images;
|
|
74
61
|
}
|
package/lib/index.js
CHANGED
|
@@ -35,29 +35,17 @@ Object.defineProperty(exports, "default", {
|
|
|
35
35
|
return _Image.default;
|
|
36
36
|
}
|
|
37
37
|
});
|
|
38
|
-
|
|
39
38
|
var _Image = _interopRequireDefault(require("./image/Image"));
|
|
40
|
-
|
|
41
39
|
var _greyAlgorithms = require("./image/transform/greyAlgorithms");
|
|
42
|
-
|
|
43
40
|
var _thresholdAlgorithms = require("./image/transform/mask/thresholdAlgorithms");
|
|
44
|
-
|
|
45
41
|
var Kernel = _interopRequireWildcard(require("./kernel/kernel"));
|
|
46
|
-
|
|
47
42
|
exports.Kernel = Kernel;
|
|
48
|
-
|
|
49
43
|
var _Stack = _interopRequireDefault(require("./stack/Stack"));
|
|
50
|
-
|
|
51
44
|
var _Shape = _interopRequireDefault(require("./util/Shape"));
|
|
52
|
-
|
|
53
45
|
var _worker = _interopRequireDefault(require("./worker/worker"));
|
|
54
|
-
|
|
55
46
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
56
|
-
|
|
57
47
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
58
|
-
|
|
59
48
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
60
|
-
|
|
61
49
|
const Static = {
|
|
62
50
|
grey: _greyAlgorithms.names,
|
|
63
51
|
threshold: _thresholdAlgorithms.names
|
package/lib/kernel/kernel.js
CHANGED
|
@@ -12,9 +12,7 @@ Object.defineProperty(exports, "laplacianOfGaussian", {
|
|
|
12
12
|
return _laplacianOfGaussian.laplacianOfGaussian;
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
|
-
|
|
16
15
|
var _kernels = require("../util/kernels");
|
|
17
|
-
|
|
18
16
|
Object.keys(_kernels).forEach(function (key) {
|
|
19
17
|
if (key === "default" || key === "__esModule") return;
|
|
20
18
|
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
@@ -26,5 +24,4 @@ Object.keys(_kernels).forEach(function (key) {
|
|
|
26
24
|
}
|
|
27
25
|
});
|
|
28
26
|
});
|
|
29
|
-
|
|
30
27
|
var _laplacianOfGaussian = require("./laplacianOfGaussian");
|
|
@@ -4,30 +4,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.laplacianOfGaussian = laplacianOfGaussian;
|
|
7
|
-
|
|
8
7
|
// http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm
|
|
8
|
+
|
|
9
9
|
function laplacianOfGaussian(sigma, nPoints, factor) {
|
|
10
10
|
let kernel = new Array(nPoints);
|
|
11
11
|
let i, j, x2, y2;
|
|
12
|
-
|
|
13
12
|
if (!factor) {
|
|
14
13
|
factor = 100;
|
|
15
14
|
}
|
|
16
|
-
|
|
17
15
|
factor *= -1; // -480/(Math.PI*Math.pow(sigma,4));
|
|
18
|
-
|
|
19
16
|
let center = (nPoints - 1) / 2;
|
|
20
17
|
let sigma2 = 2 * sigma * sigma;
|
|
21
|
-
|
|
22
18
|
for (i = 0; i < nPoints; i++) {
|
|
23
19
|
kernel[i] = new Array(nPoints);
|
|
24
20
|
y2 = (i - center) * (i - center);
|
|
25
|
-
|
|
26
21
|
for (j = 0; j < nPoints; j++) {
|
|
27
22
|
x2 = (j - center) * (j - center);
|
|
28
23
|
kernel[i][j] = Math.round(factor * (1 - (x2 + y2) / sigma2) * Math.exp(-(x2 + y2) / sigma2));
|
|
29
24
|
}
|
|
30
25
|
}
|
|
31
|
-
|
|
32
26
|
return kernel;
|
|
33
27
|
}
|
|
@@ -3,19 +3,16 @@
|
|
|
3
3
|
const {
|
|
4
4
|
Image
|
|
5
5
|
} = require('./common');
|
|
6
|
-
|
|
7
6
|
module.exports = function binary([str]) {
|
|
8
7
|
let lines = str.split(/\r?\n/).map(line => line.trim()).filter(line => line);
|
|
9
8
|
let width = lines[0].length;
|
|
10
9
|
let height = lines.length;
|
|
11
10
|
const trimmed = lines.join('');
|
|
12
11
|
const data = new Uint8Array(Math.ceil(trimmed.length / 8));
|
|
13
|
-
|
|
14
12
|
for (let i = 0; i < trimmed.length; i += 8) {
|
|
15
13
|
const index = i / 8;
|
|
16
14
|
data[index] = parseInt(trimmed.substr(i, 8).padEnd(8, '0'), 2);
|
|
17
15
|
}
|
|
18
|
-
|
|
19
16
|
return new Image(width, height, data, {
|
|
20
17
|
kind: 'BINARY'
|
|
21
18
|
});
|
package/lib/stack/Stack.js
CHANGED
|
@@ -4,30 +4,24 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _hasOwn = _interopRequireDefault(require("has-own"));
|
|
9
|
-
|
|
10
8
|
var _Image = _interopRequireDefault(require("../image/Image"));
|
|
11
|
-
|
|
12
9
|
var _extend = _interopRequireDefault(require("./extend"));
|
|
13
|
-
|
|
14
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
-
|
|
16
11
|
let computedPropertyDescriptor = {
|
|
17
12
|
configurable: true,
|
|
18
13
|
enumerable: false,
|
|
19
14
|
get: undefined
|
|
20
15
|
};
|
|
16
|
+
|
|
21
17
|
/**
|
|
22
18
|
* Class representing stack of images
|
|
23
19
|
* @class Stack
|
|
24
20
|
*/
|
|
25
|
-
|
|
26
21
|
class Stack extends Array {
|
|
27
22
|
constructor(images) {
|
|
28
23
|
if (Array.isArray(images)) {
|
|
29
24
|
super(images.length);
|
|
30
|
-
|
|
31
25
|
for (let i = 0; i < images.length; i++) {
|
|
32
26
|
this[i] = images[i];
|
|
33
27
|
}
|
|
@@ -36,31 +30,25 @@ class Stack extends Array {
|
|
|
36
30
|
} else {
|
|
37
31
|
super();
|
|
38
32
|
}
|
|
39
|
-
|
|
40
33
|
this.computed = null;
|
|
41
34
|
}
|
|
42
|
-
|
|
43
35
|
static load(urls) {
|
|
44
36
|
return Promise.all(urls.map(_Image.default.load)).then(images => new Stack(images));
|
|
45
37
|
}
|
|
46
|
-
|
|
47
38
|
static extendMethod(name, method, options = {}) {
|
|
48
39
|
let {
|
|
49
40
|
inPlace = false,
|
|
50
41
|
returnThis = true,
|
|
51
42
|
partialArgs = []
|
|
52
43
|
} = options;
|
|
53
|
-
|
|
54
44
|
if (inPlace) {
|
|
55
45
|
Stack.prototype[name] = function (...args) {
|
|
56
46
|
// remove computed properties
|
|
57
47
|
this.computed = null;
|
|
58
48
|
let result = method.apply(this, [...partialArgs, ...args]);
|
|
59
|
-
|
|
60
49
|
if (returnThis) {
|
|
61
50
|
return this;
|
|
62
51
|
}
|
|
63
|
-
|
|
64
52
|
return result;
|
|
65
53
|
};
|
|
66
54
|
} else {
|
|
@@ -68,95 +56,74 @@ class Stack extends Array {
|
|
|
68
56
|
return method.apply(this, [...partialArgs, ...args]);
|
|
69
57
|
};
|
|
70
58
|
}
|
|
71
|
-
|
|
72
59
|
return Stack;
|
|
73
60
|
}
|
|
74
|
-
|
|
75
61
|
static extendProperty(name, method, options = {}) {
|
|
76
62
|
let {
|
|
77
63
|
partialArgs = []
|
|
78
64
|
} = options;
|
|
79
|
-
|
|
80
65
|
computedPropertyDescriptor.get = function () {
|
|
81
66
|
if (this.computed === null) {
|
|
82
67
|
this.computed = {};
|
|
83
68
|
} else if ((0, _hasOwn.default)(name, this.computed)) {
|
|
84
69
|
return this.computed[name];
|
|
85
70
|
}
|
|
86
|
-
|
|
87
71
|
let result = method.apply(this, partialArgs);
|
|
88
72
|
this.computed[name] = result;
|
|
89
73
|
return result;
|
|
90
74
|
};
|
|
91
|
-
|
|
92
75
|
Object.defineProperty(Stack.prototype, name, computedPropertyDescriptor);
|
|
93
76
|
return Stack;
|
|
94
77
|
}
|
|
78
|
+
|
|
95
79
|
/**
|
|
96
80
|
* Check if a process can be applied on the stack
|
|
97
81
|
* @param {string} processName
|
|
98
82
|
* @param {object} [options]
|
|
99
83
|
* @private
|
|
100
84
|
*/
|
|
101
|
-
|
|
102
|
-
|
|
103
85
|
checkProcessable(processName, options = {}) {
|
|
104
86
|
if (typeof processName !== 'string') {
|
|
105
87
|
throw new TypeError('checkProcessable requires as first parameter the processName (a string)');
|
|
106
88
|
}
|
|
107
|
-
|
|
108
89
|
if (this.size === 0) {
|
|
109
90
|
throw new TypeError(`The process: ${processName} can not be applied on an empty stack`);
|
|
110
91
|
}
|
|
111
|
-
|
|
112
92
|
this[0].checkProcessable(processName, options);
|
|
113
|
-
|
|
114
93
|
for (let i = 1; i < this.length; i++) {
|
|
115
94
|
if ((options.sameSize === undefined || options.sameSize) && this[0].width !== this[i].width) {
|
|
116
95
|
throw new TypeError(`The process: ${processName} can not be applied if width is not identical in all images`);
|
|
117
96
|
}
|
|
118
|
-
|
|
119
97
|
if ((options.sameSize === undefined || options.sameSize) && this[0].height !== this[i].height) {
|
|
120
98
|
throw new TypeError(`The process: ${processName} can not be applied if height is not identical in all images`);
|
|
121
99
|
}
|
|
122
|
-
|
|
123
100
|
if ((options.sameAlpha === undefined || options.sameAlpha) && this[0].alpha !== this[i].alpha) {
|
|
124
101
|
throw new TypeError(`The process: ${processName} can not be applied if alpha is not identical in all images`);
|
|
125
102
|
}
|
|
126
|
-
|
|
127
103
|
if ((options.sameBitDepth === undefined || options.sameBitDepth) && this[0].bitDepth !== this[i].bitDepth) {
|
|
128
104
|
throw new TypeError(`The process: ${processName} can not be applied if bitDepth is not identical in all images`);
|
|
129
105
|
}
|
|
130
|
-
|
|
131
106
|
if ((options.sameColorModel === undefined || options.sameColorModel) && this[0].colorModel !== this[i].colorModel) {
|
|
132
107
|
throw new TypeError(`The process: ${processName} can not be applied if colorModel is not identical in all images`);
|
|
133
108
|
}
|
|
134
|
-
|
|
135
109
|
if ((options.sameNumberChannels === undefined || options.sameNumberChannels) && this[0].channels !== this[i].channels) {
|
|
136
110
|
throw new TypeError(`The process: ${processName} can not be applied if channels is not identical in all images`);
|
|
137
111
|
}
|
|
138
112
|
}
|
|
139
113
|
}
|
|
140
|
-
|
|
141
114
|
}
|
|
142
|
-
|
|
143
115
|
exports.default = Stack;
|
|
144
|
-
|
|
145
116
|
if (!Array[Symbol.species]) {
|
|
146
117
|
// support old engines
|
|
147
118
|
Stack.prototype.map = function (cb, thisArg) {
|
|
148
119
|
if (typeof cb !== 'function') {
|
|
149
120
|
throw new TypeError(`${cb} is not a function`);
|
|
150
121
|
}
|
|
151
|
-
|
|
152
122
|
let newStack = new Stack(this.length);
|
|
153
|
-
|
|
154
123
|
for (let i = 0; i < this.length; i++) {
|
|
155
124
|
newStack[i] = cb.call(thisArg, this[i], i, this);
|
|
156
125
|
}
|
|
157
|
-
|
|
158
126
|
return newStack;
|
|
159
127
|
};
|
|
160
128
|
}
|
|
161
|
-
|
|
162
129
|
(0, _extend.default)(Stack);
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = histogram;
|
|
7
|
-
|
|
8
7
|
/**
|
|
9
8
|
* @memberof Stack
|
|
10
9
|
* @instance
|
|
@@ -16,14 +15,11 @@ function histogram(options) {
|
|
|
16
15
|
bitDepth: [8, 16]
|
|
17
16
|
});
|
|
18
17
|
let histogram = this[0].getHistogram(options);
|
|
19
|
-
|
|
20
18
|
for (let i = 1; i < this.length; i++) {
|
|
21
19
|
let secondHistogram = this[i].getHistogram(options);
|
|
22
|
-
|
|
23
20
|
for (let j = 0; j < histogram.length; j++) {
|
|
24
21
|
histogram[j] += secondHistogram[j];
|
|
25
22
|
}
|
|
26
23
|
}
|
|
27
|
-
|
|
28
24
|
return histogram;
|
|
29
25
|
}
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = histograms;
|
|
7
|
-
|
|
8
7
|
/**
|
|
9
8
|
* @memberof Stack
|
|
10
9
|
* @instance
|
|
@@ -17,16 +16,13 @@ function histograms(options) {
|
|
|
17
16
|
});
|
|
18
17
|
let histograms = this[0].getHistograms(options);
|
|
19
18
|
let histogramLength = histograms[0].length;
|
|
20
|
-
|
|
21
19
|
for (let i = 1; i < this.length; i++) {
|
|
22
20
|
let secondHistograms = this[i].getHistograms(options);
|
|
23
|
-
|
|
24
21
|
for (let c = 0; c < histograms.length; c++) {
|
|
25
22
|
for (let j = 0; j < histogramLength; j++) {
|
|
26
23
|
histograms[c][j] += secondHistograms[c][j];
|
|
27
24
|
}
|
|
28
25
|
}
|
|
29
26
|
}
|
|
30
|
-
|
|
31
27
|
return histograms;
|
|
32
28
|
}
|
package/lib/stack/compute/max.js
CHANGED
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = max;
|
|
7
|
-
|
|
8
7
|
/**
|
|
9
8
|
* @memberof Stack
|
|
10
9
|
* @instance
|
|
@@ -15,12 +14,10 @@ function max() {
|
|
|
15
14
|
bitDepth: [8, 16]
|
|
16
15
|
});
|
|
17
16
|
let max = this[0].max;
|
|
18
|
-
|
|
19
17
|
for (let i = 1; i < this.length; i++) {
|
|
20
18
|
for (let j = 0; j < max.length; j++) {
|
|
21
19
|
max[j] = Math.max(max[j], this[i].max[j]);
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
|
-
|
|
25
22
|
return max;
|
|
26
23
|
}
|
|
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = median;
|
|
7
|
-
|
|
8
7
|
var _histogram = require("../../util/histogram");
|
|
9
|
-
|
|
10
8
|
/**
|
|
11
9
|
* @memberof Stack
|
|
12
10
|
* @instance
|
|
@@ -20,11 +18,9 @@ function median() {
|
|
|
20
18
|
maxSlots: this[0].maxValue + 1
|
|
21
19
|
});
|
|
22
20
|
let result = new Array(histograms.length);
|
|
23
|
-
|
|
24
21
|
for (let c = 0; c < histograms.length; c++) {
|
|
25
22
|
let histogram = histograms[c];
|
|
26
23
|
result[c] = (0, _histogram.median)(histogram);
|
|
27
24
|
}
|
|
28
|
-
|
|
29
25
|
return result;
|
|
30
26
|
}
|
package/lib/stack/compute/min.js
CHANGED
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = min;
|
|
7
|
-
|
|
8
7
|
/**
|
|
9
8
|
* @memberof Stack
|
|
10
9
|
* @instance
|
|
@@ -15,12 +14,10 @@ function min() {
|
|
|
15
14
|
bitDepth: [8, 16]
|
|
16
15
|
});
|
|
17
16
|
let min = this[0].min;
|
|
18
|
-
|
|
19
17
|
for (let i = 1; i < this.length; i++) {
|
|
20
18
|
for (let j = 0; j < min.length; j++) {
|
|
21
19
|
min[j] = Math.min(min[j], this[i].min[j]);
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
|
-
|
|
25
22
|
return min;
|
|
26
23
|
}
|
package/lib/stack/extend.js
CHANGED
|
@@ -4,28 +4,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = extend;
|
|
7
|
-
|
|
8
7
|
var _matchAndCrop = _interopRequireDefault(require("./transform/matchAndCrop"));
|
|
9
|
-
|
|
10
8
|
var _min = _interopRequireDefault(require("./compute/min"));
|
|
11
|
-
|
|
12
9
|
var _max = _interopRequireDefault(require("./compute/max"));
|
|
13
|
-
|
|
14
10
|
var _median = _interopRequireDefault(require("./compute/median"));
|
|
15
|
-
|
|
16
11
|
var _histogram = _interopRequireDefault(require("./compute/histogram"));
|
|
17
|
-
|
|
18
12
|
var _histograms = _interopRequireDefault(require("./compute/histograms"));
|
|
19
|
-
|
|
20
13
|
var _averageImage = _interopRequireDefault(require("./utility/averageImage"));
|
|
21
|
-
|
|
22
14
|
var _maxImage = _interopRequireDefault(require("./utility/maxImage"));
|
|
23
|
-
|
|
24
15
|
var _minImage = _interopRequireDefault(require("./utility/minImage"));
|
|
25
|
-
|
|
26
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
27
|
-
|
|
28
17
|
/* eslint-disable import/order */
|
|
18
|
+
|
|
29
19
|
function extend(Stack) {
|
|
30
20
|
// let inPlace = {inPlace: true};
|
|
31
21
|
Stack.extendMethod('matchAndCrop', _matchAndCrop.default);
|
|
@@ -4,13 +4,9 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = matchAndCrop;
|
|
7
|
-
|
|
8
7
|
var _Stack = _interopRequireDefault(require("../Stack"));
|
|
9
|
-
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
9
|
// TODO this code seems buggy if it is not 0,0
|
|
13
|
-
|
|
14
10
|
/**
|
|
15
11
|
* We will try to move a set of images in order to get only the best common part of them.
|
|
16
12
|
* In a stack, we compare 2 consecutive images or directly to a parent.
|
|
@@ -40,8 +36,9 @@ function matchAndCrop(options = {}) {
|
|
|
40
36
|
position: [0, 0],
|
|
41
37
|
image: this[0]
|
|
42
38
|
};
|
|
43
|
-
let relativePosition = [0, 0];
|
|
39
|
+
let relativePosition = [0, 0];
|
|
44
40
|
|
|
41
|
+
// we calculate the best relative position to the parent image
|
|
45
42
|
for (let i = 1; i < this.length; i++) {
|
|
46
43
|
let position = parent.getBestMatch(this[i], {
|
|
47
44
|
border: ignoreBorder
|
|
@@ -50,43 +47,35 @@ function matchAndCrop(options = {}) {
|
|
|
50
47
|
position: [position[0] + relativePosition[0], position[1] + relativePosition[1]],
|
|
51
48
|
image: this[i]
|
|
52
49
|
};
|
|
53
|
-
|
|
54
50
|
if (matchToPrevious) {
|
|
55
51
|
relativePosition[0] += position[0];
|
|
56
52
|
relativePosition[1] += position[1];
|
|
57
53
|
parent = this[i];
|
|
58
54
|
}
|
|
59
|
-
}
|
|
60
|
-
|
|
55
|
+
}
|
|
56
|
+
// now we can calculate the cropping that we need to do
|
|
61
57
|
|
|
62
58
|
let leftShift = 0;
|
|
63
59
|
let rightShift = 0;
|
|
64
60
|
let topShift = 0;
|
|
65
61
|
let bottomShift = 0;
|
|
66
|
-
|
|
67
62
|
for (let i = 0; i < results.length; i++) {
|
|
68
63
|
let result = results[i];
|
|
69
|
-
|
|
70
64
|
if (result.position[0] > leftShift) {
|
|
71
65
|
leftShift = result.position[0];
|
|
72
66
|
}
|
|
73
|
-
|
|
74
67
|
if (result.position[0] < rightShift) {
|
|
75
68
|
rightShift = result.position[0];
|
|
76
69
|
}
|
|
77
|
-
|
|
78
70
|
if (result.position[1] > topShift) {
|
|
79
71
|
topShift = result.position[1];
|
|
80
72
|
}
|
|
81
|
-
|
|
82
73
|
if (result.position[1] < bottomShift) {
|
|
83
74
|
bottomShift = result.position[1];
|
|
84
75
|
}
|
|
85
76
|
}
|
|
86
|
-
|
|
87
77
|
rightShift = 0 - rightShift;
|
|
88
78
|
bottomShift = 0 - bottomShift;
|
|
89
|
-
|
|
90
79
|
for (let i = 0; i < results.length; i++) {
|
|
91
80
|
let result = results[i];
|
|
92
81
|
result.crop = result.image.crop({
|
|
@@ -95,14 +84,12 @@ function matchAndCrop(options = {}) {
|
|
|
95
84
|
width: parent.width - rightShift - leftShift,
|
|
96
85
|
height: parent.height - bottomShift - topShift
|
|
97
86
|
});
|
|
98
|
-
}
|
|
99
|
-
|
|
87
|
+
}
|
|
100
88
|
|
|
89
|
+
// finally we crop and create a new array of images
|
|
101
90
|
let newImages = [];
|
|
102
|
-
|
|
103
91
|
for (let i = 0; i < results.length; i++) {
|
|
104
92
|
newImages[i] = results[i].crop;
|
|
105
93
|
}
|
|
106
|
-
|
|
107
94
|
return new _Stack.default(newImages);
|
|
108
95
|
}
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = averageImage;
|
|
7
|
-
|
|
8
7
|
var _Image = _interopRequireDefault(require("../../image/Image"));
|
|
9
|
-
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
9
|
/**
|
|
13
10
|
* @memberof Stack
|
|
14
11
|
* @instance
|
|
@@ -19,22 +16,16 @@ function averageImage() {
|
|
|
19
16
|
bitDepth: [8, 16]
|
|
20
17
|
});
|
|
21
18
|
let data = new Uint32Array(this[0].data.length);
|
|
22
|
-
|
|
23
19
|
for (let i = 0; i < this.length; i++) {
|
|
24
20
|
let current = this[i];
|
|
25
|
-
|
|
26
21
|
for (let j = 0; j < this[0].data.length; j++) {
|
|
27
22
|
data[j] += current.data[j];
|
|
28
23
|
}
|
|
29
24
|
}
|
|
30
|
-
|
|
31
25
|
let image = _Image.default.createFrom(this[0]);
|
|
32
|
-
|
|
33
26
|
let newData = image.data;
|
|
34
|
-
|
|
35
27
|
for (let i = 0; i < this[0].data.length; i++) {
|
|
36
28
|
newData[i] = data[i] / this.length;
|
|
37
29
|
}
|
|
38
|
-
|
|
39
30
|
return image;
|
|
40
31
|
}
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = maxImage;
|
|
7
|
-
|
|
8
7
|
var _Image = _interopRequireDefault(require("../../image/Image"));
|
|
9
|
-
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
9
|
/**
|
|
13
10
|
* @memberof Stack
|
|
14
11
|
* @instance
|
|
@@ -18,16 +15,12 @@ function maxImage() {
|
|
|
18
15
|
this.checkProcessable('max', {
|
|
19
16
|
bitDepth: [8, 16]
|
|
20
17
|
});
|
|
21
|
-
|
|
22
18
|
let image = _Image.default.createFrom(this[0]);
|
|
23
|
-
|
|
24
19
|
image.data.fill(0);
|
|
25
|
-
|
|
26
20
|
for (const current of this) {
|
|
27
21
|
for (let j = 0; j < image.data.length; j++) {
|
|
28
22
|
image.data[j] = Math.max(current.data[j], image.data[j]);
|
|
29
23
|
}
|
|
30
24
|
}
|
|
31
|
-
|
|
32
25
|
return image;
|
|
33
26
|
}
|
|
@@ -4,11 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = minImage;
|
|
7
|
-
|
|
8
7
|
var _Image = _interopRequireDefault(require("../../image/Image"));
|
|
9
|
-
|
|
10
8
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
-
|
|
12
9
|
/**
|
|
13
10
|
* @memberof Stack
|
|
14
11
|
* @instance
|
|
@@ -18,16 +15,12 @@ function minImage() {
|
|
|
18
15
|
this.checkProcessable('max', {
|
|
19
16
|
bitDepth: [8, 16]
|
|
20
17
|
});
|
|
21
|
-
|
|
22
18
|
let image = _Image.default.createFrom(this[0]);
|
|
23
|
-
|
|
24
19
|
image.data.fill(image.maxValue);
|
|
25
|
-
|
|
26
20
|
for (const current of this) {
|
|
27
21
|
for (let j = 0; j < image.data.length; j++) {
|
|
28
22
|
image.data[j] = Math.min(current.data[j], image.data[j]);
|
|
29
23
|
}
|
|
30
24
|
}
|
|
31
|
-
|
|
32
25
|
return image;
|
|
33
26
|
}
|