image-js 1.6.2 → 1.7.0

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.
Files changed (51) hide show
  1. package/dist/image-js.esm.js +8322 -7458
  2. package/dist/image-js.esm.js.map +1 -1
  3. package/dist/image-js.esm.min.js +2 -2
  4. package/dist/image-js.esm.min.js.map +1 -1
  5. package/dist/image-js.umd.js +8322 -7457
  6. package/dist/image-js.umd.js.map +1 -1
  7. package/dist/image-js.umd.min.js +2 -2
  8. package/dist/image-js.umd.min.js.map +1 -1
  9. package/dist-types/image-js.d.ts +40 -3
  10. package/lib/featureMatching/keypoints/getEigenvaluesForScore.d.ts +2 -2
  11. package/lib/featureMatching/keypoints/getEigenvaluesForScore.d.ts.map +1 -1
  12. package/lib/featureMatching/keypoints/getEigenvaluesForScore.js +27 -22
  13. package/lib/featureMatching/keypoints/getEigenvaluesForScore.js.map +1 -1
  14. package/lib/featureMatching/keypoints/getFastKeypoints.d.ts +4 -0
  15. package/lib/featureMatching/keypoints/getFastKeypoints.d.ts.map +1 -1
  16. package/lib/featureMatching/keypoints/getFastKeypoints.js +20 -5
  17. package/lib/featureMatching/keypoints/getFastKeypoints.js.map +1 -1
  18. package/lib/featureMatching/keypoints/getHarrisScore.js +1 -1
  19. package/lib/featureMatching/keypoints/getHarrisScore.js.map +1 -1
  20. package/lib/featureMatching/keypoints/getShiTomasiScore.d.ts +1 -2
  21. package/lib/featureMatching/keypoints/getShiTomasiScore.d.ts.map +1 -1
  22. package/lib/featureMatching/keypoints/getShiTomasiScore.js +1 -1
  23. package/lib/featureMatching/keypoints/getShiTomasiScore.js.map +1 -1
  24. package/lib/featureMatching/visualize/drawKeypoints.d.ts +2 -1
  25. package/lib/featureMatching/visualize/drawKeypoints.d.ts.map +1 -1
  26. package/lib/featureMatching/visualize/drawKeypoints.js +13 -0
  27. package/lib/featureMatching/visualize/drawKeypoints.js.map +1 -1
  28. package/lib/maskAnalysis/getContourMoore.d.ts.map +1 -1
  29. package/lib/maskAnalysis/getContourMoore.js +4 -2
  30. package/lib/maskAnalysis/getContourMoore.js.map +1 -1
  31. package/lib/maskAnalysis/getConvexityDefects.d.ts +17 -0
  32. package/lib/maskAnalysis/getConvexityDefects.d.ts.map +1 -0
  33. package/lib/maskAnalysis/getConvexityDefects.js +75 -0
  34. package/lib/maskAnalysis/getConvexityDefects.js.map +1 -0
  35. package/lib/maskAnalysis/getExternalContour.d.ts +1 -1
  36. package/lib/maskAnalysis/getExternalContour.d.ts.map +1 -1
  37. package/lib/maskAnalysis/index.d.ts +1 -0
  38. package/lib/maskAnalysis/index.d.ts.map +1 -1
  39. package/lib/maskAnalysis/index.js +1 -0
  40. package/lib/maskAnalysis/index.js.map +1 -1
  41. package/lib/roi/getExternalContour.d.ts +1 -1
  42. package/lib/roi/getExternalContour.d.ts.map +1 -1
  43. package/package.json +2 -2
  44. package/src/featureMatching/keypoints/getEigenvaluesForScore.ts +29 -27
  45. package/src/featureMatching/keypoints/getFastKeypoints.ts +23 -5
  46. package/src/featureMatching/keypoints/getHarrisScore.ts +1 -1
  47. package/src/featureMatching/keypoints/getShiTomasiScore.ts +2 -3
  48. package/src/featureMatching/visualize/drawKeypoints.ts +20 -3
  49. package/src/maskAnalysis/getContourMoore.ts +4 -3
  50. package/src/maskAnalysis/getConvexityDefects.ts +105 -0
  51. package/src/maskAnalysis/index.ts +1 -0
@@ -423,6 +423,14 @@ export declare interface ConvexHull {
423
423
  surface: number;
424
424
  }
425
425
 
426
+ export declare interface ConvexityDefectsOptions {
427
+ /**
428
+ * Depth threshold to remove smaller convexity defaults.
429
+ * @default 0
430
+ */
431
+ depthThreshold?: number;
432
+ }
433
+
426
434
  export declare interface ConvolutionOptions {
427
435
  /**
428
436
  * Specify how the borders should be handled.
@@ -775,7 +783,7 @@ export declare interface DrawKeypointsOptions {
775
783
  /**
776
784
  * Options for the coloring of the keypoints depending on their score (useful if showScore = true).
777
785
  */
778
- showScoreOptions?: GetColorsOptions;
786
+ showScoreOptions?: GetColorsOptions & DrawTextOptions;
779
787
  }
780
788
 
781
789
  /**
@@ -1064,6 +1072,23 @@ export declare interface DrawRectangleOptions<OutType> {
1064
1072
  out?: OutType;
1065
1073
  }
1066
1074
 
1075
+ declare interface DrawTextOptions {
1076
+ /**
1077
+ * General size and type of font.
1078
+ * Used as the default when font is not specified in individual text labels.
1079
+ */
1080
+ font?: string;
1081
+ /**
1082
+ * General font color.
1083
+ * Used as the default when fontColor is not specified in individual text labels.
1084
+ */
1085
+ fontColor?: number[];
1086
+ /**
1087
+ * Image to which the resulting image has to be put.
1088
+ */
1089
+ out?: Image_2;
1090
+ }
1091
+
1067
1092
  export declare interface Ellipse {
1068
1093
  center: {
1069
1094
  column: number;
@@ -1561,6 +1586,15 @@ export declare interface GetColorsOptions {
1561
1586
  minValueFactor?: number;
1562
1587
  }
1563
1588
 
1589
+ /**
1590
+ * Find border points that are farthest from its convex hull lines. Inspired by openCV's convexityDefects.
1591
+ * @param borderPoints - Mask's border points.
1592
+ * @param hullPoints - Mask's convex hull points.
1593
+ * @param options - Convexity defects options.
1594
+ * @returns Array of convexity defects.
1595
+ */
1596
+ export declare function getConvexityDefects(borderPoints: Point[], hullPoints: Point[], options?: ConvexityDefectsOptions): Point[];
1597
+
1564
1598
  /**
1565
1599
  * Get the crosscheck matches from the source and destination descriptors.
1566
1600
  * @param source - Source descriptors.
@@ -1620,6 +1654,10 @@ export declare interface GetFastKeypointsOptions extends IsFastKeypointOptions {
1620
1654
  * @default `'FAST'`
1621
1655
  */
1622
1656
  scoreAlgorithm?: 'HARRIS' | 'FAST' | 'TOMASI';
1657
+ /**
1658
+ * Value between 0 and 1 that signifies a percentage from maximum score found in the image. Points can be filtered based on this relative maximum score.
1659
+ */
1660
+ qualityThreshold?: number;
1623
1661
  /**
1624
1662
  * Options for the Harris score computation.
1625
1663
  */
@@ -1812,11 +1850,10 @@ export declare interface GetRoisOptions {
1812
1850
  export declare function getShiTomasiScore(image: Image_2, origin: Point, options?: GetShiTomasiScoreOptions): number;
1813
1851
 
1814
1852
  export declare interface GetShiTomasiScoreOptions {
1815
- qualityLevel?: number;
1816
1853
  /**
1817
1854
  * Size of the window to compute the Harris score.
1818
1855
  * Should be an odd number so that the window can be centered on the corner.
1819
- * @default `7`
1856
+ * @default `5`
1820
1857
  */
1821
1858
  windowSize?: number;
1822
1859
  }
@@ -4,8 +4,8 @@ import type { Point } from '../../index_full.ts';
4
4
  * A function that calculates eigenvalues to calculate feature score for Harris and Shi-Tomasi algorithms.
5
5
  * @param image - Image take data from.
6
6
  * @param origin - Center of the window, where the corner should be.
7
- * @param windowSize - Size of the window, where data should be scanned.
7
+ * @param cropSize - Size of the window, where data should be scanned.
8
8
  * @returns Array of two eigenvalues.
9
9
  */
10
- export declare function getEigenvaluesForScore(image: Image, origin: Point, windowSize?: number): number[];
10
+ export declare function getEigenvaluesForScore(image: Image, origin: Point, cropSize?: number): number[];
11
11
  //# sourceMappingURL=getEigenvaluesForScore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getEigenvaluesForScore.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getEigenvaluesForScore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAGjD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,KAAK,EACb,UAAU,SAAI,YAuCf"}
1
+ {"version":3,"file":"getEigenvaluesForScore.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getEigenvaluesForScore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,KAAK,EACb,QAAQ,SAAI,YAyCb"}
@@ -1,39 +1,44 @@
1
- import { EigenvalueDecomposition, Matrix, WrapperMatrix1D } from 'ml-matrix';
1
+ import { EigenvalueDecomposition, Matrix } from 'ml-matrix';
2
+ import { rawDirectConvolution } from "../../filters/convolution.js";
2
3
  import { SOBEL_X, SOBEL_Y } from '../../utils/constants/kernels.js';
3
4
  /**
4
5
  * A function that calculates eigenvalues to calculate feature score for Harris and Shi-Tomasi algorithms.
5
6
  * @param image - Image take data from.
6
7
  * @param origin - Center of the window, where the corner should be.
7
- * @param windowSize - Size of the window, where data should be scanned.
8
+ * @param cropSize - Size of the window, where data should be scanned.
8
9
  * @returns Array of two eigenvalues.
9
10
  */
10
- export function getEigenvaluesForScore(image, origin, windowSize = 7) {
11
- if (!(windowSize % 2)) {
11
+ export function getEigenvaluesForScore(image, origin, cropSize = 5) {
12
+ if (!(cropSize % 2)) {
12
13
  throw new TypeError('windowSize must be an odd integer');
13
14
  }
15
+ const kernelRadius = (SOBEL_X.length - 1) / 2;
16
+ const windowRadius = (cropSize - 1) / 2;
17
+ const padded = cropSize + 2 * kernelRadius;
14
18
  const cropOrigin = {
15
- row: origin.row - (windowSize - 1) / 2,
16
- column: origin.column - (windowSize - 1) / 2,
19
+ row: origin.row - windowRadius - kernelRadius,
20
+ column: origin.column - windowRadius - kernelRadius,
17
21
  };
18
22
  const window = image.crop({
19
23
  origin: cropOrigin,
20
- width: windowSize,
21
- height: windowSize,
24
+ width: padded,
25
+ height: padded,
22
26
  });
23
- const xDerivative = window.gradientFilter({ kernelX: SOBEL_X });
24
- const yDerivative = window.gradientFilter({ kernelY: SOBEL_Y });
25
- const xMatrix = new WrapperMatrix1D(xDerivative.getRawImage().data, {
26
- rows: xDerivative.height,
27
- });
28
- const yMatrix = new WrapperMatrix1D(yDerivative.getRawImage().data, {
29
- rows: yDerivative.height,
30
- });
31
- const xx = xMatrix.mmul(xMatrix);
32
- const xy = yMatrix.mmul(xMatrix);
33
- const yy = yMatrix.mmul(yMatrix);
34
- const xxSum = xx.sum();
35
- const xySum = xy.sum();
36
- const yySum = yy.sum();
27
+ const xDerivative = rawDirectConvolution(window, SOBEL_X);
28
+ const yDerivative = rawDirectConvolution(window, SOBEL_Y);
29
+ let xxSum = 0;
30
+ let xySum = 0;
31
+ let yySum = 0;
32
+ for (let i = kernelRadius; i < window.height - kernelRadius; i++) {
33
+ for (let j = kernelRadius; j < window.width - kernelRadius; j++) {
34
+ const idx = i * window.width + j;
35
+ const gx = xDerivative[idx];
36
+ const gy = yDerivative[idx];
37
+ xxSum += gx * gx;
38
+ xySum += gx * gy;
39
+ yySum += gy * gy;
40
+ }
41
+ }
37
42
  const structureTensor = new Matrix([
38
43
  [xxSum, xySum],
39
44
  [xySum, yySum],
@@ -1 +1 @@
1
- {"version":3,"file":"getEigenvaluesForScore.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getEigenvaluesForScore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI7E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAY,EACZ,MAAa,EACb,UAAU,GAAG,CAAC;IAEd,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC;QACtC,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC;KAC7C,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAEhE,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QAClE,IAAI,EAAE,WAAW,CAAC,MAAM;KACzB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE;QAClE,IAAI,EAAE,WAAW,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IAEvB,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC;QACjC,CAAC,KAAK,EAAE,KAAK,CAAC;QACd,CAAC,KAAK,EAAE,KAAK,CAAC;KACf,CAAC,CAAC;IAEH,OAAO,IAAI,uBAAuB,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"getEigenvaluesForScore.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getEigenvaluesForScore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAG5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACpE;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAY,EACZ,MAAa,EACb,QAAQ,GAAG,CAAC;IAEZ,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC;IAC3C,MAAM,UAAU,GAAG;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG,GAAG,YAAY,GAAG,YAAY;QAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,YAAY,GAAG,YAAY;KACpD,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,MAAM,EAAE,UAAU;QAClB,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,MAAM;KACf,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;QACjE,KAAK,IAAI,CAAC,GAAG,YAAY,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YAChE,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;YACjC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;YACjB,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC;QACjC,CAAC,KAAK,EAAE,KAAK,CAAC;QACd,CAAC,KAAK,EAAE,KAAK,CAAC;KACf,CAAC,CAAC;IAEH,OAAO,IAAI,uBAAuB,CAAC,eAAe,CAAC,CAAC,eAAe,CAAC;AACtE,CAAC"}
@@ -26,6 +26,10 @@ export interface GetFastKeypointsOptions extends IsFastKeypointOptions {
26
26
  * @default `'FAST'`
27
27
  */
28
28
  scoreAlgorithm?: 'HARRIS' | 'FAST' | 'TOMASI';
29
+ /**
30
+ * Value between 0 and 1 that signifies a percentage from maximum score found in the image. Points can be filtered based on this relative maximum score.
31
+ */
32
+ qualityThreshold?: number;
29
33
  /**
30
34
  * Options for the Harris score computation.
31
35
  */
@@ -1 +1 @@
1
- {"version":3,"file":"getFastKeypoints.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getFastKeypoints.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAQrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAIzE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC9C;;OAEG;IACH,YAAY,CAAC,EAAE,qBAAqB,GAAG,wBAAwB,CAAC;CACjE;AAED,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,uBAA4B,GACpC,YAAY,EAAE,CA2FhB"}
1
+ {"version":3,"file":"getFastKeypoints.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getFastKeypoints.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAQrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAIzE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAEvE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC9C;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,YAAY,CAAC,EAAE,qBAAqB,GAAG,wBAAwB,CAAC;CACjE;AAED,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,MAAM,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,uBAA4B,GACpC,YAAY,EAAE,CAyGhB"}
@@ -17,9 +17,10 @@ import { isFastKeypoint } from './isFastKeypoint.js';
17
17
  */
18
18
  export function getFastKeypoints(image, options = {}) {
19
19
  const { fastRadius = 3, scoreAlgorithm = 'FAST', scoreOptions } = options;
20
+ const windowSize = scoreOptions?.windowSize ?? 7;
20
21
  const circlePoints = getCirclePoints(fastRadius);
21
22
  const compassPoints = getCompassPoints(fastRadius);
22
- const { maxNbFeatures = 500, nbContiguousPixels = (3 / 4) * circlePoints.length, threshold = 20, nonMaxSuppression = true, } = options;
23
+ const { maxNbFeatures = 500, nbContiguousPixels = (3 / 4) * circlePoints.length, threshold = 20, nonMaxSuppression = true, qualityThreshold = 0, } = options;
23
24
  checkProcessable(image, {
24
25
  channels: [1],
25
26
  alpha: false,
@@ -38,10 +39,11 @@ export function getFastKeypoints(image, options = {}) {
38
39
  .with('FAST', () => fastScore)
39
40
  .with('TOMASI', () => tomasiScore)
40
41
  .exhaustive();
42
+ const padding = scoreAlgorithm === 'FAST' ? 0 : (windowSize + 1) / 2;
41
43
  const allKeypoints = [];
42
44
  const scoreArray = new Float64Array(image.size).fill(Number.NEGATIVE_INFINITY);
43
- for (let row = 0; row < image.height; row++) {
44
- for (let column = 0; column < image.width; column++) {
45
+ for (let row = padding; row < image.height - padding; row++) {
46
+ for (let column = padding; column < image.width - padding; column++) {
45
47
  const corner = { row, column };
46
48
  if (isFastKeypoint(corner, image, circlePoints, compassPoints, {
47
49
  nbContiguousPixels,
@@ -72,7 +74,20 @@ export function getFastKeypoints(image, options = {}) {
72
74
  }
73
75
  }
74
76
  }
75
- keypoints.sort((a, b) => b.score - a.score);
76
- return keypoints.slice(0, maxNbFeatures);
77
+ let maxScore = -Infinity;
78
+ for (const k of keypoints) {
79
+ if (k.score > maxScore)
80
+ maxScore = k.score;
81
+ }
82
+ const filtered = [];
83
+ // threshold by default negative infinity
84
+ const filterThreshold = qualityThreshold * maxScore;
85
+ for (const k of keypoints) {
86
+ if (k.score >= filterThreshold) {
87
+ k.score /= maxScore;
88
+ filtered.push(k);
89
+ }
90
+ }
91
+ return filtered.toSorted((a, b) => b.score - a.score).slice(0, maxNbFeatures);
77
92
  }
78
93
  //# sourceMappingURL=getFastKeypoints.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getFastKeypoints.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getFastKeypoints.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getFastKeypoints.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getFastKeypoints.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,7 @@ import { getEigenvaluesForScore } from './getEigenvaluesForScore.js';
15
15
  * @returns The Harris score.
16
16
  */
17
17
  export function getHarrisScore(image, origin, options = {}) {
18
- const { harrisConstant = 0.04, windowSize } = options;
18
+ const { harrisConstant = 0.04, windowSize = 5 } = options;
19
19
  const eigenValues = getEigenvaluesForScore(image, origin, windowSize);
20
20
  return (eigenValues[0] * eigenValues[1] -
21
21
  harrisConstant * (eigenValues[0] + eigenValues[1]) ** 2);
@@ -1 +1 @@
1
- {"version":3,"file":"getHarrisScore.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getHarrisScore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAY,EACZ,MAAa,EACb,UAAiC,EAAE;IAEnC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACtD,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEtE,OAAO,CACL,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QAC/B,cAAc,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CACxD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"getHarrisScore.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getHarrisScore.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAY,EACZ,MAAa,EACb,UAAiC,EAAE;IAEnC,MAAM,EAAE,cAAc,GAAG,IAAI,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAC1D,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEtE,OAAO,CACL,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;QAC/B,cAAc,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CACxD,CAAC;AACJ,CAAC"}
@@ -1,11 +1,10 @@
1
1
  import type { Image } from '../../Image.ts';
2
2
  import type { Point } from '../../index_full.ts';
3
3
  export interface GetShiTomasiScoreOptions {
4
- qualityLevel?: number;
5
4
  /**
6
5
  * Size of the window to compute the Harris score.
7
6
  * Should be an odd number so that the window can be centered on the corner.
8
- * @default `7`
7
+ * @default `5`
9
8
  */
10
9
  windowSize?: number;
11
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getShiTomasiScore.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getShiTomasiScore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAIjD,MAAM,WAAW,wBAAwB;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,KAAK,EACb,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAKR"}
1
+ {"version":3,"file":"getShiTomasiScore.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getShiTomasiScore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAIjD,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,KAAK,EACb,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAKR"}
@@ -11,7 +11,7 @@ import { getEigenvaluesForScore } from './getEigenvaluesForScore.js';
11
11
  * @returns The Shi-Tomasi score.
12
12
  */
13
13
  export function getShiTomasiScore(image, origin, options = {}) {
14
- const { windowSize = 7 } = options;
14
+ const { windowSize = 5 } = options;
15
15
  const eigenValues = getEigenvaluesForScore(image, origin, windowSize);
16
16
  return Math.min(eigenValues[0], eigenValues[1]);
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getShiTomasiScore.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getShiTomasiScore.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAYrE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAY,EACZ,MAAa,EACb,UAAoC,EAAE;IAEtC,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAEnC,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"getShiTomasiScore.js","sourceRoot":"","sources":["../../../src/featureMatching/keypoints/getShiTomasiScore.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAWrE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAY,EACZ,MAAa,EACb,UAAoC,EAAE;IAEtC,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC;IAEnC,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { Image } from '../../Image.js';
2
2
  import type { Point } from '../../geometry/index.js';
3
+ import type { DrawTextOptions } from '../../index_full.ts';
3
4
  import type { GetColorsOptions } from '../featureMatching.types.js';
4
5
  import type { FastKeypoint } from '../keypoints/getFastKeypoints.js';
5
6
  import type { OrientedFastKeypoint } from '../keypoints/getOrientedFastKeypoints.js';
@@ -41,7 +42,7 @@ export interface DrawKeypointsOptions {
41
42
  /**
42
43
  * Options for the coloring of the keypoints depending on their score (useful if showScore = true).
43
44
  */
44
- showScoreOptions?: GetColorsOptions;
45
+ showScoreOptions?: GetColorsOptions & DrawTextOptions;
45
46
  }
46
47
  export interface DrawOrientedKeypointsOptions extends DrawKeypointsOptions {
47
48
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"drawKeypoints.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/visualize/drawKeypoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAGrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAIrF,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IAEH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ;;OAEG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,YAAY,EAAE,EACzB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,KAAK,CAAC;AACT,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,oBAAoB,EAAE,EACjC,OAAO,CAAC,EAAE,4BAA4B,GACrC,KAAK,CAAC"}
1
+ {"version":3,"file":"drawKeypoints.d.ts","sourceRoot":"","sources":["../../../src/featureMatching/visualize/drawKeypoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAI3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAIrF,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IAEH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,GAAG,CAAC,EAAE,KAAK,CAAC;IACZ;;OAEG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAAC;CACvD;AAED,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,YAAY,EAAE,EACzB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,KAAK,CAAC;AACT,wBAAgB,aAAa,CAC3B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,oBAAoB,EAAE,EACjC,OAAO,CAAC,EAAE,4BAA4B,GACrC,KAAK,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { drawText } from "../../index_full.js";
1
2
  import { sum } from '../../utils/geometry/points.js';
2
3
  import { getOutputImage } from '../../utils/getOutputImage.js';
3
4
  import { getColors } from '../utils/getColors.js';
@@ -13,6 +14,8 @@ export function drawKeypoints(image, keypoints, options = {}) {
13
14
  const { markerSize = 10, fill = false, showScore = false, origin = { row: 0, column: 0 }, showScoreOptions, } = options;
14
15
  let { maxNbKeypoints = keypoints.length } = options;
15
16
  const { strokeColor = [255, 0, 0] } = options;
17
+ const fontColor = showScoreOptions?.fontColor ?? [0, 0, 255];
18
+ const font = showScoreOptions?.font ?? '20px Helvetica';
16
19
  if (maxNbKeypoints > keypoints.length) {
17
20
  maxNbKeypoints = keypoints.length;
18
21
  }
@@ -50,6 +53,16 @@ export function drawKeypoints(image, keypoints, options = {}) {
50
53
  });
51
54
  }
52
55
  }
56
+ if (showScore) {
57
+ drawText(newImage, keypoints.map((k) => ({
58
+ content: (k.score * 100).toFixed(2),
59
+ position: sum(k.origin, origin),
60
+ font,
61
+ fontColor: [...fontColor, 255],
62
+ })), {
63
+ out: newImage,
64
+ });
65
+ }
53
66
  return newImage;
54
67
  }
55
68
  function isOrientedFastKeypoint(kpt) {
@@ -1 +1 @@
1
- {"version":3,"file":"drawKeypoints.js","sourceRoot":"","sources":["../../../src/featureMatching/visualize/drawKeypoints.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AA8DhE;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAY,EACZ,SAAkD,EAClD,UAA+D,EAAE;IAEjE,MAAM,EACJ,UAAU,GAAG,EAAE,EACf,IAAI,GAAG,KAAK,EACZ,SAAS,GAAG,KAAK,EACjB,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAC9B,gBAAgB,GACjB,GAAG,OAAO,CAAC;IACZ,IAAI,EAAE,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,EAAE,WAAW,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC;IAE9C,IAAI,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QACtC,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;IACpC,CAAC;IAED,IAAI,QAAQ,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/D,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QAC/B,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,aAAa,GAAG,WAAW,CAAC;QAChC,IAAI,SAAS,EAAE,CAAC;YACd,aAAa,GAAG,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnD,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAEpD,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE;YAC1C,SAAS;YACT,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QACH,IACE,sBAAsB,CAAC,QAAQ,CAAC;YAC/B,OAAwC,CAAC,eAAe,EACzD,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC7B,MAAM,IAAI,GAAG,cAAc,CAAC;YAC5B,MAAM,QAAQ,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;YACzC,MAAM,EAAE,GAAU;gBAChB,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC7D,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;aACxD,CAAC;YACF,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE;gBAC1B,WAAW,EAAE,aAAa;gBAC1B,GAAG,EAAE,QAAQ;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAC7B,GAAiB;IAEjB,OAAO,OAAO,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"drawKeypoints.js","sourceRoot":"","sources":["../../../src/featureMatching/visualize/drawKeypoints.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getContourMoore.d.ts","sourceRoot":"","sources":["../../src/maskAnalysis/getContourMoore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAqCzD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,CAsDnD"}
1
+ {"version":3,"file":"getContourMoore.d.ts","sourceRoot":"","sources":["../../src/maskAnalysis/getContourMoore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAqCzD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,CAuDnD"}
@@ -37,8 +37,10 @@ export function getContourMoore(mask) {
37
37
  const [row, col] = getCoordsFromIndex(index, mask.width);
38
38
  const startingPoint = { column: col, row };
39
39
  let currentPoint = startingPoint;
40
- visited[index] = 1;
41
- contour.push(currentPoint);
40
+ if (!visited[index]) {
41
+ visited[index] = 1;
42
+ contour.push(currentPoint);
43
+ }
42
44
  const firstNext = findNextPoint(mask, currentPoint, { column: col - 1, row });
43
45
  if (!firstNext) {
44
46
  return contour;
@@ -1 +1 @@
1
- {"version":3,"file":"getContourMoore.js","sourceRoot":"","sources":["../../src/maskAnalysis/getContourMoore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getContourMoore.js","sourceRoot":"","sources":["../../src/maskAnalysis/getContourMoore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Point } from '../index_full.ts';
2
+ export interface ConvexityDefectsOptions {
3
+ /**
4
+ * Depth threshold to remove smaller convexity defaults.
5
+ * @default 0
6
+ */
7
+ depthThreshold?: number;
8
+ }
9
+ /**
10
+ * Find border points that are farthest from its convex hull lines. Inspired by openCV's convexityDefects.
11
+ * @param borderPoints - Mask's border points.
12
+ * @param hullPoints - Mask's convex hull points.
13
+ * @param options - Convexity defects options.
14
+ * @returns Array of convexity defects.
15
+ */
16
+ export declare function getConvexityDefects(borderPoints: Point[], hullPoints: Point[], options?: ConvexityDefectsOptions): Point[];
17
+ //# sourceMappingURL=getConvexityDefects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getConvexityDefects.d.ts","sourceRoot":"","sources":["../../src/maskAnalysis/getConvexityDefects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,KAAK,EAAE,EACrB,UAAU,EAAE,KAAK,EAAE,EACnB,OAAO,GAAE,uBAA4B,GACpC,KAAK,EAAE,CAsET"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Find border points that are farthest from its convex hull lines. Inspired by openCV's convexityDefects.
3
+ * @param borderPoints - Mask's border points.
4
+ * @param hullPoints - Mask's convex hull points.
5
+ * @param options - Convexity defects options.
6
+ * @returns Array of convexity defects.
7
+ */
8
+ export function getConvexityDefects(borderPoints, hullPoints, options = {}) {
9
+ const { depthThreshold = 0 } = options;
10
+ const defects = [];
11
+ if (hullPoints.length === 0) {
12
+ throw new RangeError('No hull points were defined for convexity defects detection.');
13
+ }
14
+ if (borderPoints.length === 0) {
15
+ throw new RangeError('No border points were defined for convexity defects detection.');
16
+ }
17
+ const lastHullPoint = hullPoints.at(-1);
18
+ let currBorderIndex = borderPoints.findIndex((bp) => limitReached(bp, lastHullPoint));
19
+ if (currBorderIndex === -1) {
20
+ throw new RangeError('Could not find a border point matching the convex hull endpoint.');
21
+ }
22
+ for (let i = hullPoints.length - 1; i >= 0; i--) {
23
+ const currHullPoint = hullPoints.at(i);
24
+ const nextHullPoint = hullPoints.at(i - 1);
25
+ if (!currHullPoint || !nextHullPoint)
26
+ continue;
27
+ const v0x = nextHullPoint.column - currHullPoint.column;
28
+ const v0y = nextHullPoint.row - currHullPoint.row;
29
+ const edgeLenSq = v0x * v0x + v0y * v0y;
30
+ let maxDepth = 0;
31
+ let maxDepthIndex = -1;
32
+ const segmentStart = currBorderIndex;
33
+ let reached = false;
34
+ for (let j = 0; j < borderPoints.length; j++) {
35
+ const checkIndex = (segmentStart + j) % borderPoints.length;
36
+ const bp = borderPoints[checkIndex];
37
+ if (limitReached(bp, nextHullPoint)) {
38
+ currBorderIndex = (checkIndex + 1) % borderPoints.length;
39
+ reached = true;
40
+ break;
41
+ }
42
+ const v1x = bp.column - currHullPoint.column;
43
+ const v1y = bp.row - currHullPoint.row;
44
+ const t = Math.max(0, Math.min(1, (v1x * v0x + v1y * v0y) / edgeLenSq));
45
+ const closestX = currHullPoint.column + t * v0x;
46
+ const closestY = currHullPoint.row + t * v0y;
47
+ const depth = Math.hypot(bp.column - closestX, bp.row - closestY);
48
+ if (depth > maxDepth) {
49
+ maxDepth = depth;
50
+ maxDepthIndex = checkIndex;
51
+ }
52
+ }
53
+ if (!reached) {
54
+ throw new RangeError('Could not reach the next hull point while scanning border points; hull and border may be inconsistent.');
55
+ }
56
+ if (maxDepth > depthThreshold) {
57
+ const defectPoint = borderPoints[maxDepthIndex];
58
+ if (defectPoint)
59
+ defects.push(defectPoint);
60
+ }
61
+ }
62
+ return defects;
63
+ }
64
+ /**
65
+ * Checks if borderPoint reached convex hull's point.
66
+ * @param borderPoint - Border point.
67
+ * @param hullPoint - Endpoint of convex hull segment.
68
+ * @returns whether endpoint is reached.
69
+ */
70
+ function limitReached(borderPoint, hullPoint) {
71
+ const tolerance = 1;
72
+ return (Math.abs(borderPoint.column - hullPoint.column) <= tolerance &&
73
+ Math.abs(borderPoint.row - hullPoint.row) <= tolerance);
74
+ }
75
+ //# sourceMappingURL=getConvexityDefects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getConvexityDefects.js","sourceRoot":"","sources":["../../src/maskAnalysis/getConvexityDefects.ts"],"names":[],"mappings":"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"}
@@ -7,5 +7,5 @@ export type GetExternalContourOptions = Omit<GetBorderPointsOptions, 'innerBorer
7
7
  * @param options - GetExternalContourOptions.
8
8
  * @returns Array of contour points.
9
9
  */
10
- export declare function getExternalContour(mask: Mask, options?: GetExternalContourOptions): import("../index_full.ts").Point[];
10
+ export declare function getExternalContour(mask: Mask, options?: GetExternalContourOptions): import("../index.ts").Point[];
11
11
  //# sourceMappingURL=getExternalContour.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getExternalContour.d.ts","sourceRoot":"","sources":["../../src/maskAnalysis/getExternalContour.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,sBAAsB,EACtB,aAAa,CACd,CAAC;AACF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,yBAA8B,sCAQxC"}
1
+ {"version":3,"file":"getExternalContour.d.ts","sourceRoot":"","sources":["../../src/maskAnalysis/getExternalContour.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEtE,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAC1C,sBAAsB,EACtB,aAAa,CACd,CAAC;AACF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,yBAA8B,iCAQxC"}
@@ -1,2 +1,3 @@
1
1
  export * from './maskAnalysis.types.js';
2
+ export * from './getConvexityDefects.ts';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/maskAnalysis/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/maskAnalysis/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export * from './maskAnalysis.types.js';
2
+ export * from "./getConvexityDefects.js";
2
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/maskAnalysis/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/maskAnalysis/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC"}
@@ -6,5 +6,5 @@ import type { Roi } from './Roi.ts';
6
6
  * @param options - GetExternalContourOptions.
7
7
  * @returns Array of contour points.
8
8
  */
9
- export declare function getExternalContour(roi: Roi, options?: GetExternalContourOptions): import("../index_full.ts").Point[];
9
+ export declare function getExternalContour(roi: Roi, options?: GetExternalContourOptions): import("../index.ts").Point[];
10
10
  //# sourceMappingURL=getExternalContour.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getExternalContour.d.ts","sourceRoot":"","sources":["../../src/roi/getExternalContour.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAEvF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE,yBAAyB,sCAIpC"}
1
+ {"version":3,"file":"getExternalContour.d.ts","sourceRoot":"","sources":["../../src/roi/getExternalContour.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAEvF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,GAAG,EACR,OAAO,CAAC,EAAE,yBAAyB,iCAIpC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "image-js",
3
- "version": "1.6.2",
3
+ "version": "1.7.0",
4
4
  "license": "MIT",
5
5
  "description": "Image processing and manipulation in JavaScript",
6
6
  "author": "Michaël Zasso",
@@ -108,7 +108,7 @@
108
108
  "rimraf": "^6.1.2",
109
109
  "tailwindcss": "^4.1.18",
110
110
  "typescript": "~5.9.3",
111
- "vite": "^7.3.0",
111
+ "vite": "^8.1.0",
112
112
  "vitest": "^4.0.16"
113
113
  },
114
114
  "repository": {