| /** | ||
| * Where the error is, not just how much. | ||
| * | ||
| * SSIM, PSNR and mean ΔE are global aggregates, and a global aggregate cannot | ||
| * tell two very different failures apart: a fine dusting of half-wrong pixels | ||
| * spread over the whole frame, and one solid wrong-coloured blob in the middle of | ||
| * a face. The dusting is usually invisible — it is the antialiasing along every | ||
| * edge, which any vector approximation produces. The blob is the thing a person | ||
| * actually notices. Averaged over a megapixel they can score the same. | ||
| * | ||
| * `diff --fail-over` had the same blind spot from the other direction: it gated | ||
| * on the *fraction* of changed pixels, which counts the harmless dusting and the | ||
| * damaging blob at one pixel each. | ||
| * | ||
| * This measures coherence instead. Pixels that differ beyond a perceptual | ||
| * threshold are opened morphologically — a pixel survives only if it has enough | ||
| * differing neighbours — which deletes single-pixel edge filaments while leaving | ||
| * solid regions untouched. What remains is grouped into 4-connected clusters, and | ||
| * the score is driven by the *sum of squared areas*, so one cluster of 400 px | ||
| * outweighs 400 scattered singles by a factor of 400 rather than tying with them. | ||
| * | ||
| * Pure TypeScript over the existing ΔE field, so it stays in the portable core. | ||
| */ | ||
| export interface SeverityOptions { | ||
| /** | ||
| * CIEDE2000 above which a pixel counts as differing. Default 2.0 — the usual | ||
| * "just noticeable difference" line, and the same default `diff` already uses. | ||
| */ | ||
| threshold?: number; | ||
| /** | ||
| * How many of a differing pixel's 8 neighbours must also differ for it to | ||
| * survive the open. Default 4. Below this a pixel is a filament — an | ||
| * antialiasing artifact along an edge — not a region. | ||
| */ | ||
| minNeighbours?: number; | ||
| } | ||
| export interface SeverityReport { | ||
| /** Pixels differing beyond the threshold, before the open. */ | ||
| differing: number; | ||
| /** Pixels still differing after single-pixel filaments are removed. */ | ||
| coherent: number; | ||
| /** Number of distinct 4-connected clusters among the coherent pixels. */ | ||
| clusters: number; | ||
| /** Area of the single largest cluster, in pixels. */ | ||
| largestCluster: number; | ||
| /** | ||
| * `sqrt(Σ area²) / pixels`, in [0, 1]. Squaring before summing is what makes | ||
| * one coherent blob dominate scattered dust; the square root returns it to | ||
| * pixel units so the ratio is interpretable. | ||
| */ | ||
| mass: number; | ||
| /** | ||
| * `1 - mass`, in [0, 1]. 1.0 means no coherent error anywhere. Falls fastest | ||
| * for large contiguous wrong regions, which is what a viewer sees first. | ||
| */ | ||
| score: number; | ||
| } | ||
| /** | ||
| * Cluster the perceptually-differing pixels and score by coherence. | ||
| * | ||
| * `deltaE` is the per-pixel CIEDE2000 field, already computed by | ||
| * {@link compareImages}; passing it in avoids a second colour conversion pass. | ||
| */ | ||
| export declare function severity(deltaE: Float64Array, width: number, height: number, opts?: SeverityOptions): SeverityReport; | ||
| /** | ||
| * One number for "how good is this", combining accuracy, structure and the | ||
| * location of the error. | ||
| * | ||
| * A geometric mean, deliberately: an arithmetic mean lets a strong axis carry a | ||
| * collapsed one, so a result that is sharp and correctly coloured but has a hole | ||
| * in it can still score well. Multiplying means any axis near zero drags the | ||
| * whole score down, which is the honest behaviour — a result with a hole in it is | ||
| * not "mostly fine". | ||
| * | ||
| * PSNR is unbounded above, so it is mapped through a saturating curve: 40 dB is | ||
| * treated as effectively perfect, which is where per-pixel differences stop being | ||
| * visible. SSIM is used as-is. Severity contributes its own [0,1] score. | ||
| * | ||
| * Returns `1` only for a bit-exact result. | ||
| */ | ||
| export declare function compositeScore(psnr: number, ssim: number, severityScore: number): number; | ||
| //# sourceMappingURL=severity.d.ts.map |
| {"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../../src/metrics/severity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,eAAoB,GACzB,cAAc,CAmEhB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAOxF"} |
| "use strict"; | ||
| /** | ||
| * Where the error is, not just how much. | ||
| * | ||
| * SSIM, PSNR and mean ΔE are global aggregates, and a global aggregate cannot | ||
| * tell two very different failures apart: a fine dusting of half-wrong pixels | ||
| * spread over the whole frame, and one solid wrong-coloured blob in the middle of | ||
| * a face. The dusting is usually invisible — it is the antialiasing along every | ||
| * edge, which any vector approximation produces. The blob is the thing a person | ||
| * actually notices. Averaged over a megapixel they can score the same. | ||
| * | ||
| * `diff --fail-over` had the same blind spot from the other direction: it gated | ||
| * on the *fraction* of changed pixels, which counts the harmless dusting and the | ||
| * damaging blob at one pixel each. | ||
| * | ||
| * This measures coherence instead. Pixels that differ beyond a perceptual | ||
| * threshold are opened morphologically — a pixel survives only if it has enough | ||
| * differing neighbours — which deletes single-pixel edge filaments while leaving | ||
| * solid regions untouched. What remains is grouped into 4-connected clusters, and | ||
| * the score is driven by the *sum of squared areas*, so one cluster of 400 px | ||
| * outweighs 400 scattered singles by a factor of 400 rather than tying with them. | ||
| * | ||
| * Pure TypeScript over the existing ΔE field, so it stays in the portable core. | ||
| */ | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.severity = severity; | ||
| exports.compositeScore = compositeScore; | ||
| /** | ||
| * Cluster the perceptually-differing pixels and score by coherence. | ||
| * | ||
| * `deltaE` is the per-pixel CIEDE2000 field, already computed by | ||
| * {@link compareImages}; passing it in avoids a second colour conversion pass. | ||
| */ | ||
| function severity(deltaE, width, height, opts = {}) { | ||
| const threshold = opts.threshold ?? 2.0; | ||
| const minNeighbours = opts.minNeighbours ?? 4; | ||
| const n = width * height; | ||
| const empty = { | ||
| differing: 0, coherent: 0, clusters: 0, largestCluster: 0, mass: 0, score: 1, | ||
| }; | ||
| if (n === 0) | ||
| return empty; | ||
| const bad = new Uint8Array(n); | ||
| let differing = 0; | ||
| for (let i = 0; i < n; i++) { | ||
| if (deltaE[i] > threshold) { | ||
| bad[i] = 1; | ||
| differing++; | ||
| } | ||
| } | ||
| if (differing === 0) | ||
| return empty; | ||
| // Morphological open by neighbour count. A pixel on a one-pixel-wide edge | ||
| // filament has at most two differing neighbours along the filament; a pixel | ||
| // inside a solid wrong region has eight. The cutoff separates them without | ||
| // needing a structuring element or a second buffer pass. | ||
| const kept = new Uint8Array(n); | ||
| let coherent = 0; | ||
| for (let y = 0; y < height; y++) { | ||
| for (let x = 0; x < width; x++) { | ||
| const i = y * width + x; | ||
| if (!bad[i]) | ||
| continue; | ||
| let c = 0; | ||
| for (let dy = -1; dy <= 1; dy++) { | ||
| const yy = y + dy; | ||
| if (yy < 0 || yy >= height) | ||
| continue; | ||
| for (let dx = -1; dx <= 1; dx++) { | ||
| if (dx === 0 && dy === 0) | ||
| continue; | ||
| const xx = x + dx; | ||
| if (xx < 0 || xx >= width) | ||
| continue; | ||
| if (bad[yy * width + xx]) | ||
| c++; | ||
| } | ||
| } | ||
| if (c >= minNeighbours) { | ||
| kept[i] = 1; | ||
| coherent++; | ||
| } | ||
| } | ||
| } | ||
| if (coherent === 0) { | ||
| return { differing, coherent: 0, clusters: 0, largestCluster: 0, mass: 0, score: 1 }; | ||
| } | ||
| // 4-connected labelling with an explicit stack — recursion would blow the call | ||
| // stack on a large contiguous region, which is exactly the case that matters. | ||
| const seen = new Uint8Array(n); | ||
| const stack = new Int32Array(coherent); | ||
| let clusters = 0, largest = 0, sumSq = 0; | ||
| for (let s = 0; s < n; s++) { | ||
| if (!kept[s] || seen[s]) | ||
| continue; | ||
| clusters++; | ||
| let top = 0, area = 0; | ||
| stack[top++] = s; | ||
| seen[s] = 1; | ||
| while (top > 0) { | ||
| const i = stack[--top]; | ||
| area++; | ||
| const x = i % width, y = (i - x) / width; | ||
| if (x > 0 && kept[i - 1] && !seen[i - 1]) { | ||
| seen[i - 1] = 1; | ||
| stack[top++] = i - 1; | ||
| } | ||
| if (x + 1 < width && kept[i + 1] && !seen[i + 1]) { | ||
| seen[i + 1] = 1; | ||
| stack[top++] = i + 1; | ||
| } | ||
| if (y > 0 && kept[i - width] && !seen[i - width]) { | ||
| seen[i - width] = 1; | ||
| stack[top++] = i - width; | ||
| } | ||
| if (y + 1 < height && kept[i + width] && !seen[i + width]) { | ||
| seen[i + width] = 1; | ||
| stack[top++] = i + width; | ||
| } | ||
| } | ||
| if (area > largest) | ||
| largest = area; | ||
| sumSq += area * area; | ||
| } | ||
| const mass = Math.min(1, Math.sqrt(sumSq) / n); | ||
| return { differing, coherent, clusters, largestCluster: largest, mass, score: 1 - mass }; | ||
| } | ||
| /** | ||
| * One number for "how good is this", combining accuracy, structure and the | ||
| * location of the error. | ||
| * | ||
| * A geometric mean, deliberately: an arithmetic mean lets a strong axis carry a | ||
| * collapsed one, so a result that is sharp and correctly coloured but has a hole | ||
| * in it can still score well. Multiplying means any axis near zero drags the | ||
| * whole score down, which is the honest behaviour — a result with a hole in it is | ||
| * not "mostly fine". | ||
| * | ||
| * PSNR is unbounded above, so it is mapped through a saturating curve: 40 dB is | ||
| * treated as effectively perfect, which is where per-pixel differences stop being | ||
| * visible. SSIM is used as-is. Severity contributes its own [0,1] score. | ||
| * | ||
| * Returns `1` only for a bit-exact result. | ||
| */ | ||
| function compositeScore(psnr, ssim, severityScore) { | ||
| const p = Number.isFinite(psnr) ? Math.max(0, Math.min(1, psnr / 40)) : 1; | ||
| const s = Math.max(0, Math.min(1, ssim)); | ||
| const v = Math.max(0, Math.min(1, severityScore)); | ||
| // SSIM is squared so structure counts double: it is the axis that best tracks | ||
| // what a person calls "does this look like the original". | ||
| return Math.pow(p * s * s * v, 1 / 4); | ||
| } | ||
| //# sourceMappingURL=severity.js.map |
| {"version":3,"file":"severity.js","sourceRoot":"","sources":["../../../src/metrics/severity.ts"],"names":[],"mappings":"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"} |
| /** | ||
| * Where the error is, not just how much. | ||
| * | ||
| * SSIM, PSNR and mean ΔE are global aggregates, and a global aggregate cannot | ||
| * tell two very different failures apart: a fine dusting of half-wrong pixels | ||
| * spread over the whole frame, and one solid wrong-coloured blob in the middle of | ||
| * a face. The dusting is usually invisible — it is the antialiasing along every | ||
| * edge, which any vector approximation produces. The blob is the thing a person | ||
| * actually notices. Averaged over a megapixel they can score the same. | ||
| * | ||
| * `diff --fail-over` had the same blind spot from the other direction: it gated | ||
| * on the *fraction* of changed pixels, which counts the harmless dusting and the | ||
| * damaging blob at one pixel each. | ||
| * | ||
| * This measures coherence instead. Pixels that differ beyond a perceptual | ||
| * threshold are opened morphologically — a pixel survives only if it has enough | ||
| * differing neighbours — which deletes single-pixel edge filaments while leaving | ||
| * solid regions untouched. What remains is grouped into 4-connected clusters, and | ||
| * the score is driven by the *sum of squared areas*, so one cluster of 400 px | ||
| * outweighs 400 scattered singles by a factor of 400 rather than tying with them. | ||
| * | ||
| * Pure TypeScript over the existing ΔE field, so it stays in the portable core. | ||
| */ | ||
| export interface SeverityOptions { | ||
| /** | ||
| * CIEDE2000 above which a pixel counts as differing. Default 2.0 — the usual | ||
| * "just noticeable difference" line, and the same default `diff` already uses. | ||
| */ | ||
| threshold?: number; | ||
| /** | ||
| * How many of a differing pixel's 8 neighbours must also differ for it to | ||
| * survive the open. Default 4. Below this a pixel is a filament — an | ||
| * antialiasing artifact along an edge — not a region. | ||
| */ | ||
| minNeighbours?: number; | ||
| } | ||
| export interface SeverityReport { | ||
| /** Pixels differing beyond the threshold, before the open. */ | ||
| differing: number; | ||
| /** Pixels still differing after single-pixel filaments are removed. */ | ||
| coherent: number; | ||
| /** Number of distinct 4-connected clusters among the coherent pixels. */ | ||
| clusters: number; | ||
| /** Area of the single largest cluster, in pixels. */ | ||
| largestCluster: number; | ||
| /** | ||
| * `sqrt(Σ area²) / pixels`, in [0, 1]. Squaring before summing is what makes | ||
| * one coherent blob dominate scattered dust; the square root returns it to | ||
| * pixel units so the ratio is interpretable. | ||
| */ | ||
| mass: number; | ||
| /** | ||
| * `1 - mass`, in [0, 1]. 1.0 means no coherent error anywhere. Falls fastest | ||
| * for large contiguous wrong regions, which is what a viewer sees first. | ||
| */ | ||
| score: number; | ||
| } | ||
| /** | ||
| * Cluster the perceptually-differing pixels and score by coherence. | ||
| * | ||
| * `deltaE` is the per-pixel CIEDE2000 field, already computed by | ||
| * {@link compareImages}; passing it in avoids a second colour conversion pass. | ||
| */ | ||
| export declare function severity(deltaE: Float64Array, width: number, height: number, opts?: SeverityOptions): SeverityReport; | ||
| /** | ||
| * One number for "how good is this", combining accuracy, structure and the | ||
| * location of the error. | ||
| * | ||
| * A geometric mean, deliberately: an arithmetic mean lets a strong axis carry a | ||
| * collapsed one, so a result that is sharp and correctly coloured but has a hole | ||
| * in it can still score well. Multiplying means any axis near zero drags the | ||
| * whole score down, which is the honest behaviour — a result with a hole in it is | ||
| * not "mostly fine". | ||
| * | ||
| * PSNR is unbounded above, so it is mapped through a saturating curve: 40 dB is | ||
| * treated as effectively perfect, which is where per-pixel differences stop being | ||
| * visible. SSIM is used as-is. Severity contributes its own [0,1] score. | ||
| * | ||
| * Returns `1` only for a bit-exact result. | ||
| */ | ||
| export declare function compositeScore(psnr: number, ssim: number, severityScore: number): number; | ||
| //# sourceMappingURL=severity.d.ts.map |
| {"version":3,"file":"severity.d.ts","sourceRoot":"","sources":["../../../src/metrics/severity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,eAAoB,GACzB,cAAc,CAmEhB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAOxF"} |
| /** | ||
| * Where the error is, not just how much. | ||
| * | ||
| * SSIM, PSNR and mean ΔE are global aggregates, and a global aggregate cannot | ||
| * tell two very different failures apart: a fine dusting of half-wrong pixels | ||
| * spread over the whole frame, and one solid wrong-coloured blob in the middle of | ||
| * a face. The dusting is usually invisible — it is the antialiasing along every | ||
| * edge, which any vector approximation produces. The blob is the thing a person | ||
| * actually notices. Averaged over a megapixel they can score the same. | ||
| * | ||
| * `diff --fail-over` had the same blind spot from the other direction: it gated | ||
| * on the *fraction* of changed pixels, which counts the harmless dusting and the | ||
| * damaging blob at one pixel each. | ||
| * | ||
| * This measures coherence instead. Pixels that differ beyond a perceptual | ||
| * threshold are opened morphologically — a pixel survives only if it has enough | ||
| * differing neighbours — which deletes single-pixel edge filaments while leaving | ||
| * solid regions untouched. What remains is grouped into 4-connected clusters, and | ||
| * the score is driven by the *sum of squared areas*, so one cluster of 400 px | ||
| * outweighs 400 scattered singles by a factor of 400 rather than tying with them. | ||
| * | ||
| * Pure TypeScript over the existing ΔE field, so it stays in the portable core. | ||
| */ | ||
| /** | ||
| * Cluster the perceptually-differing pixels and score by coherence. | ||
| * | ||
| * `deltaE` is the per-pixel CIEDE2000 field, already computed by | ||
| * {@link compareImages}; passing it in avoids a second colour conversion pass. | ||
| */ | ||
| export function severity(deltaE, width, height, opts = {}) { | ||
| const threshold = opts.threshold ?? 2.0; | ||
| const minNeighbours = opts.minNeighbours ?? 4; | ||
| const n = width * height; | ||
| const empty = { | ||
| differing: 0, coherent: 0, clusters: 0, largestCluster: 0, mass: 0, score: 1, | ||
| }; | ||
| if (n === 0) | ||
| return empty; | ||
| const bad = new Uint8Array(n); | ||
| let differing = 0; | ||
| for (let i = 0; i < n; i++) { | ||
| if (deltaE[i] > threshold) { | ||
| bad[i] = 1; | ||
| differing++; | ||
| } | ||
| } | ||
| if (differing === 0) | ||
| return empty; | ||
| // Morphological open by neighbour count. A pixel on a one-pixel-wide edge | ||
| // filament has at most two differing neighbours along the filament; a pixel | ||
| // inside a solid wrong region has eight. The cutoff separates them without | ||
| // needing a structuring element or a second buffer pass. | ||
| const kept = new Uint8Array(n); | ||
| let coherent = 0; | ||
| for (let y = 0; y < height; y++) { | ||
| for (let x = 0; x < width; x++) { | ||
| const i = y * width + x; | ||
| if (!bad[i]) | ||
| continue; | ||
| let c = 0; | ||
| for (let dy = -1; dy <= 1; dy++) { | ||
| const yy = y + dy; | ||
| if (yy < 0 || yy >= height) | ||
| continue; | ||
| for (let dx = -1; dx <= 1; dx++) { | ||
| if (dx === 0 && dy === 0) | ||
| continue; | ||
| const xx = x + dx; | ||
| if (xx < 0 || xx >= width) | ||
| continue; | ||
| if (bad[yy * width + xx]) | ||
| c++; | ||
| } | ||
| } | ||
| if (c >= minNeighbours) { | ||
| kept[i] = 1; | ||
| coherent++; | ||
| } | ||
| } | ||
| } | ||
| if (coherent === 0) { | ||
| return { differing, coherent: 0, clusters: 0, largestCluster: 0, mass: 0, score: 1 }; | ||
| } | ||
| // 4-connected labelling with an explicit stack — recursion would blow the call | ||
| // stack on a large contiguous region, which is exactly the case that matters. | ||
| const seen = new Uint8Array(n); | ||
| const stack = new Int32Array(coherent); | ||
| let clusters = 0, largest = 0, sumSq = 0; | ||
| for (let s = 0; s < n; s++) { | ||
| if (!kept[s] || seen[s]) | ||
| continue; | ||
| clusters++; | ||
| let top = 0, area = 0; | ||
| stack[top++] = s; | ||
| seen[s] = 1; | ||
| while (top > 0) { | ||
| const i = stack[--top]; | ||
| area++; | ||
| const x = i % width, y = (i - x) / width; | ||
| if (x > 0 && kept[i - 1] && !seen[i - 1]) { | ||
| seen[i - 1] = 1; | ||
| stack[top++] = i - 1; | ||
| } | ||
| if (x + 1 < width && kept[i + 1] && !seen[i + 1]) { | ||
| seen[i + 1] = 1; | ||
| stack[top++] = i + 1; | ||
| } | ||
| if (y > 0 && kept[i - width] && !seen[i - width]) { | ||
| seen[i - width] = 1; | ||
| stack[top++] = i - width; | ||
| } | ||
| if (y + 1 < height && kept[i + width] && !seen[i + width]) { | ||
| seen[i + width] = 1; | ||
| stack[top++] = i + width; | ||
| } | ||
| } | ||
| if (area > largest) | ||
| largest = area; | ||
| sumSq += area * area; | ||
| } | ||
| const mass = Math.min(1, Math.sqrt(sumSq) / n); | ||
| return { differing, coherent, clusters, largestCluster: largest, mass, score: 1 - mass }; | ||
| } | ||
| /** | ||
| * One number for "how good is this", combining accuracy, structure and the | ||
| * location of the error. | ||
| * | ||
| * A geometric mean, deliberately: an arithmetic mean lets a strong axis carry a | ||
| * collapsed one, so a result that is sharp and correctly coloured but has a hole | ||
| * in it can still score well. Multiplying means any axis near zero drags the | ||
| * whole score down, which is the honest behaviour — a result with a hole in it is | ||
| * not "mostly fine". | ||
| * | ||
| * PSNR is unbounded above, so it is mapped through a saturating curve: 40 dB is | ||
| * treated as effectively perfect, which is where per-pixel differences stop being | ||
| * visible. SSIM is used as-is. Severity contributes its own [0,1] score. | ||
| * | ||
| * Returns `1` only for a bit-exact result. | ||
| */ | ||
| export function compositeScore(psnr, ssim, severityScore) { | ||
| const p = Number.isFinite(psnr) ? Math.max(0, Math.min(1, psnr / 40)) : 1; | ||
| const s = Math.max(0, Math.min(1, ssim)); | ||
| const v = Math.max(0, Math.min(1, severityScore)); | ||
| // SSIM is squared so structure counts double: it is the axis that best tracks | ||
| // what a person calls "does this look like the original". | ||
| return Math.pow(p * s * s * v, 1 / 4); | ||
| } | ||
| //# sourceMappingURL=severity.js.map |
| {"version":3,"file":"severity.js","sourceRoot":"","sources":["../../../src/metrics/severity.ts"],"names":[],"mappings":"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"} |
@@ -10,3 +10,3 @@ import { type DecodeOptions } from './io/decode.js'; | ||
| import { type TraceOptions } from './vectorize/trace.js'; | ||
| export declare const VERSION = "1.42.0"; | ||
| export declare const VERSION = "1.43.0"; | ||
| export type VectorizeModeOption = VectorizeMode | 'auto' | 'lossless'; | ||
@@ -13,0 +13,0 @@ export type Preset = 'auto' | 'logo' | 'lineart' | 'poster' | 'photo' | 'detailed' | 'pixelart' | 'exact'; |
+1
-1
@@ -22,3 +22,3 @@ "use strict"; | ||
| const trace_js_1 = require("./vectorize/trace.js"); | ||
| exports.VERSION = '1.42.0'; | ||
| exports.VERSION = '1.43.0'; | ||
| const GENERATOR = `Generated by vecline v${exports.VERSION}`; | ||
@@ -25,0 +25,0 @@ /** |
@@ -64,3 +64,3 @@ /** | ||
| /** Version of the package this build came from. */ | ||
| export declare const VERSION = "1.42.0"; | ||
| export declare const VERSION = "1.43.0"; | ||
| //# sourceMappingURL=core.d.ts.map |
+1
-1
@@ -205,3 +205,3 @@ "use strict"; | ||
| /** Version of the package this build came from. */ | ||
| exports.VERSION = '1.42.0'; | ||
| exports.VERSION = '1.43.0'; | ||
| //# sourceMappingURL=core.js.map |
| import type { AlphaMode, QualityReport, RasterImage, Rgba } from '../types.js'; | ||
| import { ssimPlane } from './ssim.js'; | ||
| export { ssimPlane }; | ||
| export { severity, compositeScore, type SeverityReport, type SeverityOptions } from './severity.js'; | ||
| export interface CompareOptions { | ||
@@ -12,2 +13,8 @@ /** | ||
| deltaEBackground?: Rgba; | ||
| /** | ||
| * Also cluster the differing pixels and report where the error is, plus a | ||
| * single composite score. Off by default: it costs one extra pass over the | ||
| * image, and the existing aggregates are what most callers read. | ||
| */ | ||
| severity?: boolean; | ||
| /** Skip the CIEDE2000 pass, which is the expensive part on large photos. */ | ||
@@ -14,0 +21,0 @@ skipDeltaE?: boolean; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,WAAW,EACtB,IAAI,GAAE,cAAmB,GACxB,aAAa,CAgFf"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEpG,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,WAAW,EACtB,IAAI,GAAE,cAAmB,GACxB,aAAa,CA8Ff"} |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.ssimPlane = void 0; | ||
| exports.compositeScore = exports.severity = exports.ssimPlane = void 0; | ||
| exports.compareImages = compareImages; | ||
| const color_js_1 = require("../color.js"); | ||
| const severity_js_1 = require("./severity.js"); | ||
| const image_js_1 = require("../image.js"); | ||
| const ssim_js_1 = require("./ssim.js"); | ||
| Object.defineProperty(exports, "ssimPlane", { enumerable: true, get: function () { return ssim_js_1.ssimPlane; } }); | ||
| var severity_js_2 = require("./severity.js"); | ||
| Object.defineProperty(exports, "severity", { enumerable: true, get: function () { return severity_js_2.severity; } }); | ||
| Object.defineProperty(exports, "compositeScore", { enumerable: true, get: function () { return severity_js_2.compositeScore; } }); | ||
| const WHITE = { r: 255, g: 255, b: 255, a: 255 }; | ||
@@ -66,5 +70,16 @@ /** | ||
| let deltaE = { mean: 0, p95: 0, max: 0 }; | ||
| // The per-pixel field is only retained when severity is asked for, so the | ||
| // default path allocates nothing extra. | ||
| const field = opts.severity && !lossless ? new Float64Array(pixels) : undefined; | ||
| if (!lossless && !opts.skipDeltaE) { | ||
| deltaE = deltaEStats(reference, candidate, bg); | ||
| deltaE = deltaEStats(reference, candidate, bg, field); | ||
| } | ||
| let sev; | ||
| let composite; | ||
| if (opts.severity) { | ||
| sev = lossless | ||
| ? { differing: 0, coherent: 0, clusters: 0, largestCluster: 0, mass: 0, score: 1 } | ||
| : (0, severity_js_1.severity)(field ?? new Float64Array(pixels), width, height); | ||
| composite = lossless ? 1 : (0, severity_js_1.compositeScore)(psnr, ssim, sev.score); | ||
| } | ||
| return { | ||
@@ -86,2 +101,4 @@ width, | ||
| lossless, | ||
| severity: sev, | ||
| composite, | ||
| }; | ||
@@ -110,3 +127,7 @@ } | ||
| */ | ||
| function deltaEStats(reference, candidate, bg) { | ||
| function deltaEStats(reference, candidate, bg, | ||
| // When supplied, the per-pixel CIEDE2000 is retained here as well as binned. | ||
| // Severity clustering needs the field, and recomputing it would mean a second | ||
| // full Lab conversion over the image for no new information. | ||
| field) { | ||
| const flatA = (0, image_js_1.compositeOver)(reference, bg); | ||
@@ -132,2 +153,4 @@ const flatB = (0, image_js_1.compositeOver)(candidate, bg); | ||
| const de = (0, color_js_1.deltaE2000)(labA[0], labA[1], labA[2], labB[0], labB[1], labB[2]); | ||
| if (field) | ||
| field[i] = de; | ||
| sum += de; | ||
@@ -134,0 +157,0 @@ if (de > max) |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"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"} |
+13
-0
@@ -108,2 +108,3 @@ /** | ||
| /** Full-reference quality comparison between two same-sized rasters. */ | ||
| import type { SeverityReport } from './metrics/severity.js'; | ||
| export interface QualityReport { | ||
@@ -138,3 +139,15 @@ width: number; | ||
| lossless: boolean; | ||
| /** | ||
| * Where the error is, not just how much — present when was asked | ||
| * for. Global aggregates cannot separate a harmless dusting of antialiasing | ||
| * from one solid wrong-coloured region; this clusters the differing pixels so | ||
| * a coherent blob outweighs scattered dust. | ||
| */ | ||
| severity?: SeverityReport; | ||
| /** | ||
| * A single geometric-mean score over accuracy, structure and error coherence, | ||
| * in [0, 1]. Geometric so no strong axis can carry a collapsed one. | ||
| */ | ||
| composite?: number; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,UAAU,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,YAAY,GACpB,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GACjD,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAElC,kDAAkD;AAClD,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,UAAU,CAAC;AAErD,4CAA4C;AAC5C,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,KAAK;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,8CAA8C;AAC9C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,IAAI,EAAE,aAAa,CAAC;IACpB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,QAAQ,EAAE,OAAO,CAAC;IAClB,uCAAuC;IACvC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACpD,6DAA6D;IAC7D,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,GAAG,EAAE,OAAO,CAAC;IACb,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAExD,wEAAwE;AACxE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,wFAAwF;IACxF,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,gBAAgB,EAAE,IAAI,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,sDAAsD;IACtD,QAAQ,EAAE,OAAO,CAAC;CACnB"} | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"} |
@@ -10,3 +10,3 @@ import { type DecodeOptions } from './io/decode.js'; | ||
| import { type TraceOptions } from './vectorize/trace.js'; | ||
| export declare const VERSION = "1.42.0"; | ||
| export declare const VERSION = "1.43.0"; | ||
| export type VectorizeModeOption = VectorizeMode | 'auto' | 'lossless'; | ||
@@ -13,0 +13,0 @@ export type Preset = 'auto' | 'logo' | 'lineart' | 'poster' | 'photo' | 'detailed' | 'pixelart' | 'exact'; |
+1
-1
@@ -12,3 +12,3 @@ import { basename } from 'node:path'; | ||
| import { trace, TRACE_DEFAULTS } from './vectorize/trace.js'; | ||
| export const VERSION = '1.42.0'; | ||
| export const VERSION = '1.43.0'; | ||
| const GENERATOR = `Generated by vecline v${VERSION}`; | ||
@@ -15,0 +15,0 @@ /** |
@@ -64,3 +64,3 @@ /** | ||
| /** Version of the package this build came from. */ | ||
| export declare const VERSION = "1.42.0"; | ||
| export declare const VERSION = "1.43.0"; | ||
| //# sourceMappingURL=core.d.ts.map |
+1
-1
@@ -96,3 +96,3 @@ /** | ||
| /** Version of the package this build came from. */ | ||
| export const VERSION = '1.42.0'; | ||
| export const VERSION = '1.43.0'; | ||
| //# sourceMappingURL=core.js.map |
| import type { AlphaMode, QualityReport, RasterImage, Rgba } from '../types.js'; | ||
| import { ssimPlane } from './ssim.js'; | ||
| export { ssimPlane }; | ||
| export { severity, compositeScore, type SeverityReport, type SeverityOptions } from './severity.js'; | ||
| export interface CompareOptions { | ||
@@ -12,2 +13,8 @@ /** | ||
| deltaEBackground?: Rgba; | ||
| /** | ||
| * Also cluster the differing pixels and report where the error is, plus a | ||
| * single composite score. Off by default: it costs one extra pass over the | ||
| * image, and the existing aggregates are what most callers read. | ||
| */ | ||
| severity?: boolean; | ||
| /** Skip the CIEDE2000 pass, which is the expensive part on large photos. */ | ||
@@ -14,0 +21,0 @@ skipDeltaE?: boolean; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,CAAC;AAErB,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,WAAW,EACtB,IAAI,GAAE,cAAmB,GACxB,aAAa,CAgFf"} | ||
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AAEpG,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,IAAI,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAID;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,WAAW,EACtB,SAAS,EAAE,WAAW,EACtB,IAAI,GAAE,cAAmB,GACxB,aAAa,CA8Ff"} |
| import { deltaE2000, luma709, srgbToLab } from '../color.js'; | ||
| import { severity, compositeScore } from './severity.js'; | ||
| import { compositeOver, premultiply, sameSize } from '../image.js'; | ||
| import { ssimPlane } from './ssim.js'; | ||
| export { ssimPlane }; | ||
| export { severity, compositeScore } from './severity.js'; | ||
| const WHITE = { r: 255, g: 255, b: 255, a: 255 }; | ||
@@ -62,5 +64,16 @@ /** | ||
| let deltaE = { mean: 0, p95: 0, max: 0 }; | ||
| // The per-pixel field is only retained when severity is asked for, so the | ||
| // default path allocates nothing extra. | ||
| const field = opts.severity && !lossless ? new Float64Array(pixels) : undefined; | ||
| if (!lossless && !opts.skipDeltaE) { | ||
| deltaE = deltaEStats(reference, candidate, bg); | ||
| deltaE = deltaEStats(reference, candidate, bg, field); | ||
| } | ||
| let sev; | ||
| let composite; | ||
| if (opts.severity) { | ||
| sev = lossless | ||
| ? { differing: 0, coherent: 0, clusters: 0, largestCluster: 0, mass: 0, score: 1 } | ||
| : severity(field ?? new Float64Array(pixels), width, height); | ||
| composite = lossless ? 1 : compositeScore(psnr, ssim, sev.score); | ||
| } | ||
| return { | ||
@@ -82,2 +95,4 @@ width, | ||
| lossless, | ||
| severity: sev, | ||
| composite, | ||
| }; | ||
@@ -106,3 +121,7 @@ } | ||
| */ | ||
| function deltaEStats(reference, candidate, bg) { | ||
| function deltaEStats(reference, candidate, bg, | ||
| // When supplied, the per-pixel CIEDE2000 is retained here as well as binned. | ||
| // Severity clustering needs the field, and recomputing it would mean a second | ||
| // full Lab conversion over the image for no new information. | ||
| field) { | ||
| const flatA = compositeOver(reference, bg); | ||
@@ -128,2 +147,4 @@ const flatB = compositeOver(candidate, bg); | ||
| const de = deltaE2000(labA[0], labA[1], labA[2], labB[0], labB[1], labB[2]); | ||
| if (field) | ||
| field[i] = de; | ||
| sum += de; | ||
@@ -130,0 +151,0 @@ if (de > max) |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/metrics/index.ts"],"names":[],"mappings":"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"} |
+13
-0
@@ -108,2 +108,3 @@ /** | ||
| /** Full-reference quality comparison between two same-sized rasters. */ | ||
| import type { SeverityReport } from './metrics/severity.js'; | ||
| export interface QualityReport { | ||
@@ -138,3 +139,15 @@ width: number; | ||
| lossless: boolean; | ||
| /** | ||
| * Where the error is, not just how much — present when was asked | ||
| * for. Global aggregates cannot separate a harmless dusting of antialiasing | ||
| * from one solid wrong-coloured region; this clusters the differing pixels so | ||
| * a coherent blob outweighs scattered dust. | ||
| */ | ||
| severity?: SeverityReport; | ||
| /** | ||
| * A single geometric-mean score over accuracy, structure and error coherence, | ||
| * in [0, 1]. Geometric so no strong axis can carry a collapsed one. | ||
| */ | ||
| composite?: number; | ||
| } | ||
| //# sourceMappingURL=types.d.ts.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "vecline", | ||
| "version": "1.42.0", | ||
| "version": "1.43.0", | ||
| "mcpName": "io.github.shunyagatha/vecline", | ||
@@ -5,0 +5,0 @@ "description": "The measurable image + document toolkit for JavaScript. On flat art -- logos, icons, UI, screenshots, pixel art -- the SVG is bit-exact: SSIM 1.0000, zero differing pixels, verified by rendering it back. On photographs it leads potrace, imagetracerjs and vtracer on SSIM, and says how close it landed instead of claiming perfection. Converts any of 11 raster formats to any other, writes cut-ready DXF that declares its own physical size, plus EPS, PDF and G-code for lasers, plotters and CNC. Renders PDF and Office (docx/xlsx/pptx), images-to-PDF, centerline tracing, gradients, content-aware crop and image editing. Zero-dependency portable core, an MCP server for AI agents, and a local bridge (vecline serve) so a browser can drive your LibreOffice without uploading anything.", |
+1
-0
@@ -428,2 +428,3 @@ # Vecline | ||
| | `--black-on-white <bool>` | With `--threshold`: dark pixels are the shape (default true) | | ||
| | `--severity` | With `--verify`: also report *where* the error is. SSIM, PSNR and mean ΔE are global aggregates and cannot separate a harmless dusting of antialiasing along every edge from one solid wrong region — averaged over a megapixel they score alike. Differing pixels are opened to remove one-pixel filaments, clustered, and scored by summed squared area so a coherent blob outweighs scattered dust. Adds a `Composite`: a geometric mean over accuracy, structure and coherence, so no strong axis carries a collapsed one | | ||
| | `--adaptive` | Threshold against each pixel's own neighbourhood (Bradley–Roth) rather than one cutoff for the frame. For a photograph of paper, where one corner is in shadow and no global number serves both ends: on a page whose ink sits a constant 35% below its *local* paper, Otsu scores F1 26.4% (it floods the shadowed half) and this scores 100%. Also on `centerline` and `gcode`, where it matters most. Off by default — on evenly-lit art Otsu is the better estimator | | ||
@@ -430,0 +431,0 @@ | `--adaptive-window <px>` | Neighbourhood side for `--adaptive`; 0 (default) is an eighth of the shorter side | |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
2616542
1.53%529
1.54%31190
1.81%691
0.14%