feat: Dewarp-Korrektur als Schritt 2 in OCR Pipeline (7 Schritte)

Implementiert Buchwoelbungs-Entzerrung mit zwei Methoden:
- Methode A: Vertikale-Kanten-Analyse (Sobel + Polynom 2. Grades)
- Methode B: Textzeilen-Baseline (Tesseract + Baseline-Kruemmung)
Beste Methode wird automatisch gewaehlt, manueller Slider (-3 bis +3).

Backend: 3 neue Endpoints (auto/manual dewarp, ground truth)
Frontend: StepDewarp + DewarpControls, Pipeline von 6 auf 7 Schritte

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-02-26 16:46:41 +01:00
parent d552fd8b6b
commit 589d2f811a
13 changed files with 858 additions and 28 deletions

View File

@@ -4,6 +4,7 @@ import { useState } from 'react'
import { PagePurpose } from '@/components/common/PagePurpose'
import { PipelineStepper } from '@/components/ocr-pipeline/PipelineStepper'
import { StepDeskew } from '@/components/ocr-pipeline/StepDeskew'
import { StepDewarp } from '@/components/ocr-pipeline/StepDewarp'
import { StepColumnDetection } from '@/components/ocr-pipeline/StepColumnDetection'
import { StepWordRecognition } from '@/components/ocr-pipeline/StepWordRecognition'
import { StepCoordinates } from '@/components/ocr-pipeline/StepCoordinates'
@@ -13,6 +14,7 @@ import { PIPELINE_STEPS, type PipelineStep } from './types'
export default function OcrPipelinePage() {
const [currentStep, setCurrentStep] = useState(0)
const [sessionId, setSessionId] = useState<string | null>(null)
const [steps, setSteps] = useState<PipelineStep[]>(
PIPELINE_STEPS.map((s, i) => ({
...s,
@@ -39,19 +41,26 @@ export default function OcrPipelinePage() {
}
}
const handleDeskewComplete = (sid: string) => {
setSessionId(sid)
handleNext()
}
const renderStep = () => {
switch (currentStep) {
case 0:
return <StepDeskew onNext={handleNext} />
return <StepDeskew onNext={handleDeskewComplete} />
case 1:
return <StepColumnDetection />
return <StepDewarp sessionId={sessionId} onNext={handleNext} />
case 2:
return <StepWordRecognition />
return <StepColumnDetection />
case 3:
return <StepCoordinates />
return <StepWordRecognition />
case 4:
return <StepReconstruction />
return <StepCoordinates />
case 5:
return <StepReconstruction />
case 6:
return <StepGroundTruth />
default:
return null

View File

@@ -33,8 +33,25 @@ export interface DeskewGroundTruth {
notes?: string
}
export interface DewarpResult {
session_id: string
method_used: 'vertical_edge' | 'text_baseline' | 'manual' | 'none'
curvature_px: number
confidence: number
duration_seconds: number
dewarped_image_url: string
scale_applied?: number
}
export interface DewarpGroundTruth {
is_correct: boolean
corrected_scale?: number
notes?: string
}
export const PIPELINE_STEPS: PipelineStep[] = [
{ id: 'deskew', name: 'Begradigung', icon: '📐', status: 'pending' },
{ id: 'dewarp', name: 'Entzerrung', icon: '🔧', status: 'pending' },
{ id: 'columns', name: 'Spalten', icon: '📊', status: 'pending' },
{ id: 'words', name: 'Woerter', icon: '🔤', status: 'pending' },
{ id: 'coordinates', name: 'Koordinaten', icon: '📍', status: 'pending' },