@pilio/gemini-watermark-remover 1.0.26 → 1.0.28

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 (34) hide show
  1. package/README.md +91 -91
  2. package/README_zh.md +414 -414
  3. package/package.json +10 -1
  4. package/skills/gemini-watermark-remover/SKILL.md +32 -32
  5. package/skills/gemini-watermark-remover/references/usage.md +23 -23
  6. package/src/core/candidateEvaluation.js +182 -0
  7. package/src/core/candidateSelector.js +46 -28
  8. package/src/core/imageWatermarkPipeline.js +127 -0
  9. package/src/core/imageWatermarkPipelineRequest.js +39 -0
  10. package/src/core/pipelineAcceptedExecutor.js +299 -0
  11. package/src/core/pipelineAcceptedExecutorRequest.js +44 -0
  12. package/src/core/pipelineAcceptedFinalizationRequest.js +21 -0
  13. package/src/core/pipelineAlphaStageSpecs.js +573 -0
  14. package/src/core/pipelineAlphaTraceContract.js +56 -0
  15. package/src/core/pipelineAlphaTrial.js +223 -0
  16. package/src/core/pipelineDecisionPath.js +161 -0
  17. package/src/core/pipelineDetectionCandidate.js +128 -0
  18. package/src/core/pipelineFinalization.js +46 -0
  19. package/src/core/pipelineInitialContext.js +52 -0
  20. package/src/core/pipelineInitialSelection.js +61 -0
  21. package/src/core/pipelineLayerContracts.js +163 -0
  22. package/src/core/pipelineMeta.js +201 -0
  23. package/src/core/pipelineMetrics.js +88 -0
  24. package/src/core/pipelinePassState.js +36 -0
  25. package/src/core/pipelineRepairGates.js +124 -0
  26. package/src/core/pipelineRepairStageSpecs.js +491 -0
  27. package/src/core/pipelineRepairTrial.js +156 -0
  28. package/src/core/pipelineResult.js +128 -0
  29. package/src/core/pipelineRuntime.js +689 -0
  30. package/src/core/pipelineRuntimeBootstrap.js +78 -0
  31. package/src/core/pipelineState.js +134 -0
  32. package/src/core/pipelineTimings.js +36 -0
  33. package/src/core/pipelineTrace.js +28 -0
  34. package/src/core/watermarkProcessor.js +1188 -1297
@@ -0,0 +1,299 @@
1
+ import {
2
+ createAlphaRescueStageSequenceSpecs,
3
+ createFineAlphaTrialSequenceSpecs,
4
+ createLocatedAggressiveStageSpec,
5
+ createRecalibrationStageSpec,
6
+ createSmallAnchorAlphaStageSequenceSpecs,
7
+ createSubpixelOutlineAlphaStageSpecs
8
+ } from './pipelineAlphaStageSpecs.js';
9
+ import {
10
+ createAlphaRepairPipelineRuntime,
11
+ runCurrentAlphaStageSpecPhase,
12
+ runCurrentRepairStageSpecPhase,
13
+ runCurrentAlphaTrialSpecPhase,
14
+ runLocatedAggressiveStage,
15
+ runPreviewBackgroundCleanupStage,
16
+ runRecalibrationStage,
17
+ runRepairCleanupSpecPhase
18
+ } from './pipelineRuntime.js';
19
+ import {
20
+ createPostLocatedRepairStageSequenceSpecs,
21
+ createPreviewBackgroundCleanupStageSpec,
22
+ createRepairCleanupPhaseSpecs,
23
+ createTailRepairStageSequenceSpecs
24
+ } from './pipelineRepairStageSpecs.js';
25
+
26
+ export function runAcceptedAlphaRepairPipeline({
27
+ nowMs = Date.now,
28
+ totalStartedAt = null,
29
+ runtimeBootstrap,
30
+ pipelineTraceRecorder,
31
+ originalImageData,
32
+ alpha96,
33
+ getAlphaMap,
34
+ alpha96Variants = null,
35
+ locatedAggressiveRemoval,
36
+ debugTimings = null,
37
+ debugTimingsEnabled = false,
38
+ visualPostProcessingEnabled = false,
39
+ templateWarp = null,
40
+ passState,
41
+ subpixelShift = null,
42
+ metrics = {},
43
+ gates = {},
44
+ config = {},
45
+ refiners = {}
46
+ } = {}) {
47
+ const {
48
+ readPipelineState,
49
+ applyPipelineState,
50
+ cleanupFlags
51
+ } = runtimeBootstrap;
52
+ const {
53
+ usePreviewAnchorFastCleanup,
54
+ useKnown48EdgeCleanup,
55
+ useV2SmallEdgeCleanup
56
+ } = cleanupFlags;
57
+ const {
58
+ recordAlphaTrialEvent,
59
+ acceptCurrentAlphaTrialResult,
60
+ acceptCurrentAlphaStageResult,
61
+ acceptCurrentRepairTrialResult,
62
+ acceptRecalibrationStageResult,
63
+ acceptLocatedAggressiveResult,
64
+ acceptPreviewBackgroundCleanupResult,
65
+ assignTailDebugTimings
66
+ } = createAlphaRepairPipelineRuntime({
67
+ traceRecorder: pipelineTraceRecorder,
68
+ readState: readPipelineState,
69
+ applyState: applyPipelineState,
70
+ debugTimings
71
+ });
72
+
73
+ runRecalibrationStage(createRecalibrationStageSpec({
74
+ nowMs,
75
+ readState: readPipelineState,
76
+ shouldRecalibrateAlphaStrength: gates.shouldRecalibrateAlphaStrength,
77
+ calculateNearBlackRatio: metrics.calculateNearBlackRatio,
78
+ computeRegionGradientCorrelation: metrics.computeRegionGradientCorrelation,
79
+ acceptRecalibrationStageResult,
80
+ debugTimings,
81
+ debugTimingsEnabled,
82
+ refiners: {
83
+ recalibrateAlphaStrength: refiners.recalibrateAlphaStrength
84
+ }
85
+ }));
86
+
87
+ runCurrentAlphaTrialSpecPhase({
88
+ createSpecs: () => {
89
+ const current = readPipelineState();
90
+ return createFineAlphaTrialSequenceSpecs({
91
+ nowMs,
92
+ readState: readPipelineState,
93
+ originalImageData,
94
+ originalSpatialScore: current.originalSpatialScore,
95
+ originalGradientScore: current.originalGradientScore,
96
+ calculateNearBlackRatio: metrics.calculateNearBlackRatio,
97
+ acceptCurrentAlphaTrialResult,
98
+ debugTimings,
99
+ debugTimingsEnabled,
100
+ refiners: {
101
+ recalibrateOverSubtractedAlpha: refiners.recalibrateOverSubtractedAlpha,
102
+ fineTuneDarkCatalogAlpha: refiners.fineTuneDarkCatalogAlpha,
103
+ fineTuneWeakPositiveResidualAlpha: refiners.fineTuneWeakPositiveResidualAlpha
104
+ }
105
+ });
106
+ }
107
+ });
108
+
109
+ runPreviewBackgroundCleanupStage(createPreviewBackgroundCleanupStageSpec({
110
+ nowMs,
111
+ readState: readPipelineState,
112
+ visualPostProcessingEnabled,
113
+ maxNearBlackRatioIncrease: config.maxNearBlackRatioIncrease,
114
+ measureOuterBorderLuminanceStd: metrics.measureOuterBorderLuminanceStd,
115
+ shouldApplyPreviewSmoothBackgroundCleanup: gates.shouldApplyPreviewSmoothBackgroundCleanup,
116
+ applyPreviewSmoothBackgroundCleanup: refiners.applyPreviewSmoothBackgroundCleanup,
117
+ createRegionCorrelationMetrics: metrics.createRegionCorrelationMetrics,
118
+ calculateNearBlackRatio: metrics.calculateNearBlackRatio,
119
+ acceptPreviewBackgroundCleanupResult,
120
+ debugTimings,
121
+ debugTimingsEnabled
122
+ }));
123
+
124
+ const subpixelStartedAt = nowMs();
125
+ const subpixelAlphaStageResults = runCurrentAlphaStageSpecPhase({
126
+ createSpecs: () => createSubpixelOutlineAlphaStageSpecs({
127
+ readState: readPipelineState,
128
+ calculateNearBlackRatio: metrics.calculateNearBlackRatio,
129
+ templateWarp,
130
+ visualPostProcessingEnabled,
131
+ usePreviewAnchorFastCleanup,
132
+ outlineConfig: config.outlineConfig,
133
+ acceptCurrentAlphaStageResult,
134
+ refiners: {
135
+ refineSubpixelOutline: refiners.refineSubpixelOutline
136
+ }
137
+ })
138
+ });
139
+ const subpixelRefined = subpixelAlphaStageResults[0];
140
+ if (subpixelRefined) {
141
+ subpixelShift = subpixelRefined.shift;
142
+ }
143
+ if (debugTimingsEnabled && debugTimings) {
144
+ debugTimings.subpixelRefinementMs = nowMs() - subpixelStartedAt;
145
+ }
146
+
147
+ const shouldRunEdgeCleanup = visualPostProcessingEnabled || useKnown48EdgeCleanup || useV2SmallEdgeCleanup;
148
+ const {
149
+ previewEdgeCleanupElapsedMs
150
+ } = runRepairCleanupSpecPhase({
151
+ createSpecs: () => createRepairCleanupPhaseSpecs({
152
+ nowMs,
153
+ readState: readPipelineState,
154
+ shouldRunEdgeCleanup,
155
+ useKnown48EdgeCleanup,
156
+ useV2SmallEdgeCleanup,
157
+ usePreviewAnchorFastCleanup,
158
+ cleanupConfig: config.repairCleanupConfig,
159
+ acceptCurrentRepairTrialResult,
160
+ refiners: {
161
+ refinePreviewResidualEdge: refiners.refinePreviewResidualEdge,
162
+ refineKnown48FlatBackgroundResidual: refiners.refineKnown48FlatBackgroundResidual,
163
+ refineKnown48LumaEdgeResidual: refiners.refineKnown48LumaEdgeResidual,
164
+ refineNewMargin96FlatBackgroundResidual: refiners.refineNewMargin96FlatBackgroundResidual
165
+ }
166
+ })
167
+ });
168
+
169
+ const smallAnchorTimingAnchors = {};
170
+ const smallAnchorAlphaStageResults = runCurrentAlphaStageSpecPhase({
171
+ createSpecs: () => createSmallAnchorAlphaStageSequenceSpecs({
172
+ nowMs,
173
+ timingAnchors: smallAnchorTimingAnchors,
174
+ readState: readPipelineState,
175
+ originalImageData,
176
+ originalGradientScore: readPipelineState().originalGradientScore,
177
+ alpha96,
178
+ getAlphaMap,
179
+ visualPostProcessingEnabled,
180
+ assessWatermarkResidualVisibility: metrics.assessWatermarkResidualVisibility,
181
+ acceptCurrentAlphaStageResult,
182
+ refiners: {
183
+ refineSmallPreviewAnchorCandidate: refiners.refineSmallPreviewAnchorCandidate,
184
+ refineSmallFixedLocalAnchorGeometry: refiners.refineSmallFixedLocalAnchorGeometry
185
+ }
186
+ })
187
+ });
188
+ const smallFixedLocalRelocated = smallAnchorAlphaStageResults[1];
189
+
190
+ const locatedAggressiveStartedAt = nowMs();
191
+ const locatedAggressiveRun = runLocatedAggressiveStage(createLocatedAggressiveStageSpec({
192
+ readState: readPipelineState,
193
+ originalImageData,
194
+ originalSpatialScore: readPipelineState().originalSpatialScore,
195
+ originalGradientScore: readPipelineState().originalGradientScore,
196
+ smallFixedLocalRelocated,
197
+ locatedAggressiveRemovalEnabled: locatedAggressiveRemoval,
198
+ assessWatermarkResidualVisibility: metrics.assessWatermarkResidualVisibility,
199
+ shouldSkipLocatedAggressiveForCleanCanonical96: gates.shouldSkipLocatedAggressiveForCleanCanonical96,
200
+ recordAlphaTrialEvent,
201
+ acceptLocatedAggressiveResult,
202
+ currentPassState: passState,
203
+ refiners: {
204
+ refineLocatedAggressiveRemoval: refiners.refineLocatedAggressiveRemoval
205
+ }
206
+ }));
207
+ passState = locatedAggressiveRun.passState;
208
+
209
+ const postLocatedRepairTimingAnchors = {};
210
+ runCurrentRepairStageSpecPhase({
211
+ createSpecs: () => {
212
+ const current = readPipelineState();
213
+ return createPostLocatedRepairStageSequenceSpecs({
214
+ nowMs,
215
+ timingAnchors: postLocatedRepairTimingAnchors,
216
+ readState: readPipelineState,
217
+ originalImageData,
218
+ originalSpatialScore: current.originalSpatialScore,
219
+ originalGradientScore: current.originalGradientScore,
220
+ acceptCurrentRepairTrialResult,
221
+ refiners: {
222
+ refineCanonical96PositiveHaloResidual: refiners.refineCanonical96PositiveHaloResidual,
223
+ refineSmoothLocatedResidualWithEstimatedPrior: refiners.refineSmoothLocatedResidualWithEstimatedPrior
224
+ }
225
+ });
226
+ }
227
+ });
228
+
229
+ const alphaRescueTimingAnchors = {};
230
+ runCurrentAlphaStageSpecPhase({
231
+ createSpecs: () => {
232
+ const current = readPipelineState();
233
+ return createAlphaRescueStageSequenceSpecs({
234
+ nowMs,
235
+ timingAnchors: alphaRescueTimingAnchors,
236
+ readState: readPipelineState,
237
+ originalImageData,
238
+ originalSpatialScore: current.originalSpatialScore,
239
+ originalGradientScore: current.originalGradientScore,
240
+ resolveVariantAlphaMap: () => (
241
+ alpha96Variants?.['20260520'] ??
242
+ (typeof getAlphaMap === 'function' ? getAlphaMap('96-20260520') : null)
243
+ ),
244
+ acceptCurrentAlphaStageResult,
245
+ refiners: {
246
+ refineNewMargin96VariantResidual: refiners.refineNewMargin96VariantResidual,
247
+ refineKnown48AntiTemplateResidual: refiners.refineKnown48AntiTemplateResidual,
248
+ refineKnown48PowerProfileResidual: refiners.refineKnown48PowerProfileResidual,
249
+ refineKnown48PositiveResidualRebalance: refiners.refineKnown48PositiveResidualRebalance
250
+ }
251
+ });
252
+ }
253
+ });
254
+
255
+ const tailRepairTimingAnchors = {};
256
+ runCurrentRepairStageSpecPhase({
257
+ createSpecs: () => {
258
+ const current = readPipelineState();
259
+ return createTailRepairStageSequenceSpecs({
260
+ nowMs,
261
+ timingAnchors: tailRepairTimingAnchors,
262
+ readState: readPipelineState,
263
+ originalImageData,
264
+ originalSpatialScore: current.originalSpatialScore,
265
+ originalGradientScore: current.originalGradientScore,
266
+ alpha96,
267
+ getAlphaMap,
268
+ acceptCurrentRepairTrialResult,
269
+ refiners: {
270
+ refineKnown48SmallMarginPriorRepairResidual: refiners.refineKnown48SmallMarginPriorRepairResidual,
271
+ refineSmallLocatedPriorRepairResidual: refiners.refineSmallLocatedPriorRepairResidual,
272
+ refineKnown48BoundaryRepairResidual: refiners.refineKnown48BoundaryRepairResidual,
273
+ refineDarkHaloResidual: refiners.refineDarkHaloResidual,
274
+ refineQuantizedNegativeBodyResidual: refiners.refineQuantizedNegativeBodyResidual,
275
+ refineKnown48MidCoreBiasResidual: refiners.refineKnown48MidCoreBiasResidual
276
+ }
277
+ });
278
+ }
279
+ });
280
+
281
+ if (debugTimingsEnabled && debugTimings) {
282
+ assignTailDebugTimings({
283
+ nowMs,
284
+ totalStartedAt,
285
+ previewEdgeCleanupElapsedMs,
286
+ ...smallAnchorTimingAnchors,
287
+ locatedAggressiveStartedAt,
288
+ ...postLocatedRepairTimingAnchors,
289
+ ...alphaRescueTimingAnchors,
290
+ ...tailRepairTimingAnchors
291
+ });
292
+ }
293
+
294
+ return {
295
+ passState,
296
+ subpixelShift,
297
+ readPipelineState
298
+ };
299
+ }
@@ -0,0 +1,44 @@
1
+ export function createAcceptedPipelineExecutorRequest({
2
+ nowMs,
3
+ options = {},
4
+ totalStartedAt,
5
+ runtimeBootstrap,
6
+ pipelineTraceRecorder,
7
+ originalImageData,
8
+ alpha96,
9
+ debugTimings,
10
+ debugTimingsEnabled,
11
+ visualPostProcessingEnabled,
12
+ templateWarp,
13
+ subpixelShift,
14
+ acceptedPipelineDependencies
15
+ } = {}) {
16
+ const {
17
+ metrics,
18
+ gates,
19
+ config: executorConfig,
20
+ refiners
21
+ } = acceptedPipelineDependencies;
22
+
23
+ return {
24
+ nowMs,
25
+ totalStartedAt,
26
+ runtimeBootstrap,
27
+ pipelineTraceRecorder,
28
+ originalImageData,
29
+ alpha96,
30
+ getAlphaMap: options.getAlphaMap,
31
+ alpha96Variants: options.alpha96Variants ?? null,
32
+ locatedAggressiveRemoval: options.locatedAggressiveRemoval,
33
+ debugTimings,
34
+ debugTimingsEnabled,
35
+ visualPostProcessingEnabled,
36
+ templateWarp,
37
+ passState: runtimeBootstrap.passState,
38
+ subpixelShift,
39
+ metrics,
40
+ gates,
41
+ config: executorConfig,
42
+ refiners
43
+ };
44
+ }
@@ -0,0 +1,21 @@
1
+ export function createAcceptedPipelineFinalizationRequest({
2
+ acceptedPipelineRun,
3
+ pipelineTraceRecorder = {},
4
+ resultContext = {},
5
+ originalImageData = null,
6
+ initialSelection = null,
7
+ resolvedConfig = null
8
+ } = {}) {
9
+ return {
10
+ pipelineState: acceptedPipelineRun.readPipelineState(),
11
+ passState: acceptedPipelineRun.passState,
12
+ traceState: {
13
+ alphaAdjustmentStages: pipelineTraceRecorder.alphaAdjustmentStages,
14
+ alphaTrialEvents: pipelineTraceRecorder.alphaTrialEvents
15
+ },
16
+ resultContext,
17
+ originalImageData,
18
+ initialSelection,
19
+ resolvedConfig
20
+ };
21
+ }