Informes_Nasa/resolucion_ojo_humano_vs_camaras.html

1713 lines
66 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Comparación de Resolución Visual Humana y Sistemas de Cámaras</title>
<meta name="description" content="Informe técnico comparativo entre la capacidad de resolución angular del ojo humano y sistemas de visión artificial industrial (MeltTools PIXI y Basler ace 2 R).">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root {
--bg-body: #0a0d14;
--bg-surface: #111622;
--bg-surface-elevated: #182030;
--bg-surface-glass: rgba(17, 22, 34, 0.78);
--border-subtle: #202a3e;
--border-focus: #3b82f6;
--text-primary: #f1f5f9;
--text-secondary: #94a3b8;
--text-muted: #64748b;
--accent-blue: #38bdf8;
--accent-blue-rgb: 56, 189, 248;
--accent-indigo: #6366f1;
--accent-emerald: #10b981;
--accent-amber: #f59e0b;
--accent-rose: #f43f5e;
--gradient-accent: linear-gradient(135deg, #38bdf8 0%, #6366f1 100%);
--gradient-card: linear-gradient(180deg, rgba(24, 32, 48, 0.6) 0%, rgba(17, 22, 34, 0.8) 100%);
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);
--shadow-md: 0 8px 24px -4px rgba(0, 0, 0, 0.45);
--shadow-glow: 0 0 35px -5px rgba(56, 189, 248, 0.15);
--radius-sm: 8px;
--radius-md: 14px;
--radius-lg: 20px;
}
[data-theme="light"] {
--bg-body: #f8fafc;
--bg-surface: #ffffff;
--bg-surface-elevated: #f1f5f9;
--bg-surface-glass: rgba(255, 255, 255, 0.85);
--border-subtle: #e2e8f0;
--border-focus: #2563eb;
--text-primary: #0f172a;
--text-secondary: #475569;
--text-muted: #94a3b8;
--accent-blue: #0284c7;
--accent-blue-rgb: 2, 132, 199;
--accent-indigo: #4f46e5;
--accent-emerald: #059669;
--accent-amber: #d97706;
--accent-rose: #e11d48;
--gradient-accent: linear-gradient(135deg, #0284c7 0%, #4f46e5 100%);
--gradient-card: linear-gradient(180deg, rgba(255, 255, 255, 0.95) 0%, rgba(241, 245, 249, 0.8) 100%);
--shadow-sm: 0 2px 6px rgba(0, 0, 0, 0.05);
--shadow-md: 0 10px 25px -5px rgba(15, 23, 42, 0.08);
--shadow-glow: 0 0 30px -5px rgba(2, 132, 199, 0.12);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: 'Plus Jakarta Sans', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: var(--bg-body);
color: var(--text-primary);
line-height: 1.65;
-webkit-font-smoothing: antialiased;
transition: background-color 0.3s ease, color 0.3s ease;
background-image:
radial-gradient(ellipse 80% 50% at 50% -20%, rgba(56, 189, 248, 0.08), transparent),
radial-gradient(ellipse 60% 40% at 100% 60%, rgba(99, 102, 241, 0.05), transparent);
background-attachment: fixed;
}
code, pre, .font-mono {
font-family: 'JetBrains Mono', monospace;
}
/* Layout */
.app-container {
display: grid;
grid-template-columns: 280px 1fr;
min-height: 100vh;
max-width: 1540px;
margin: 0 auto;
}
/* Sidebar Navigation */
.sidebar {
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
padding: 2rem 1.25rem;
border-right: 1px solid var(--border-subtle);
background: var(--bg-surface);
display: flex;
flex-direction: column;
gap: 1.5rem;
}
.brand-badge {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.35rem 0.75rem;
background: rgba(var(--accent-blue-rgb), 0.12);
border: 1px solid rgba(var(--accent-blue-rgb), 0.25);
border-radius: 9999px;
font-size: 0.75rem;
font-weight: 700;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--accent-blue);
width: fit-content;
}
.sidebar-title {
font-size: 1.05rem;
font-weight: 700;
color: var(--text-primary);
line-height: 1.35;
}
.nav-list {
list-style: none;
display: flex;
flex-direction: column;
gap: 0.35rem;
}
.nav-link {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.6rem 0.85rem;
color: var(--text-secondary);
text-decoration: none;
font-size: 0.875rem;
font-weight: 500;
border-radius: var(--radius-sm);
transition: all 0.2s ease;
border-left: 2px solid transparent;
}
.nav-link:hover {
background: var(--bg-surface-elevated);
color: var(--text-primary);
border-left-color: var(--accent-blue);
padding-left: 1.1rem;
}
.nav-link.active {
background: rgba(var(--accent-blue-rgb), 0.1);
color: var(--accent-blue);
border-left-color: var(--accent-blue);
font-weight: 600;
}
.nav-num {
font-family: 'JetBrains Mono', monospace;
font-size: 0.75rem;
opacity: 0.7;
}
.sidebar-footer {
margin-top: auto;
padding-top: 1.5rem;
border-top: 1px solid var(--border-subtle);
display: flex;
flex-direction: column;
gap: 0.75rem;
}
/* Main Content */
.main-content {
padding: 2.5rem 3.5rem;
overflow-x: hidden;
}
/* Header Bar */
.top-actions {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 0.75rem;
margin-bottom: 2rem;
}
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.55rem 1rem;
border-radius: var(--radius-sm);
font-size: 0.85rem;
font-weight: 600;
cursor: pointer;
border: 1px solid var(--border-subtle);
background: var(--bg-surface);
color: var(--text-primary);
transition: all 0.2s ease;
}
.btn:hover {
background: var(--bg-surface-elevated);
border-color: var(--accent-blue);
transform: translateY(-1px);
}
.btn-primary {
background: var(--gradient-accent);
color: #ffffff;
border: none;
box-shadow: 0 4px 12px rgba(56, 189, 248, 0.3);
}
.btn-primary:hover {
box-shadow: 0 6px 18px rgba(56, 189, 248, 0.4);
transform: translateY(-1px);
}
/* Hero Banner */
.hero {
position: relative;
padding: 2.5rem;
background: var(--gradient-card);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
margin-bottom: 2.5rem;
box-shadow: var(--shadow-glow);
overflow: hidden;
}
.hero::before {
content: "";
position: absolute;
top: -50%;
right: -20%;
width: 450px;
height: 450px;
background: radial-gradient(circle, rgba(56, 189, 248, 0.12) 0%, transparent 70%);
pointer-events: none;
}
.hero-tag {
color: var(--accent-blue);
font-size: 0.825rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
margin-bottom: 0.75rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.hero-title {
font-size: 2.25rem;
font-weight: 800;
line-height: 1.2;
color: var(--text-primary);
margin-bottom: 1rem;
max-width: 900px;
letter-spacing: -0.02em;
}
.hero-subtitle {
font-size: 1.05rem;
color: var(--text-secondary);
max-width: 780px;
}
.hero-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 1rem;
margin-top: 2rem;
padding-top: 1.75rem;
border-top: 1px solid var(--border-subtle);
}
.stat-card {
background: rgba(var(--accent-blue-rgb), 0.05);
border: 1px solid rgba(var(--accent-blue-rgb), 0.15);
border-radius: var(--radius-md);
padding: 1rem 1.25rem;
}
.stat-label {
font-size: 0.775rem;
color: var(--text-muted);
text-transform: uppercase;
font-weight: 600;
letter-spacing: 0.04em;
}
.stat-val {
font-size: 1.65rem;
font-weight: 800;
color: var(--accent-blue);
margin-top: 0.25rem;
font-family: 'JetBrains Mono', monospace;
}
.stat-desc {
font-size: 0.775rem;
color: var(--text-secondary);
margin-top: 0.2rem;
}
/* Section Cards */
.section-card {
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-lg);
padding: 2.25rem;
margin-bottom: 2rem;
box-shadow: var(--shadow-sm);
scroll-margin-top: 2rem;
position: relative;
}
.section-header {
display: flex;
align-items: flex-start;
gap: 1rem;
margin-bottom: 1.5rem;
border-bottom: 1px solid var(--border-subtle);
padding-bottom: 1rem;
}
.section-icon {
width: 44px;
height: 44px;
border-radius: var(--radius-md);
background: rgba(var(--accent-blue-rgb), 0.12);
color: var(--accent-blue);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.section-title-wrap h2 {
font-size: 1.45rem;
font-weight: 700;
color: var(--text-primary);
letter-spacing: -0.01em;
}
.section-title-wrap p {
font-size: 0.875rem;
color: var(--text-secondary);
margin-top: 0.2rem;
}
p {
color: var(--text-secondary);
margin-bottom: 1.25rem;
font-size: 0.965rem;
}
strong {
color: var(--text-primary);
font-weight: 600;
}
/* Formula Box */
.formula-box {
background: var(--bg-surface-elevated);
border: 1px dashed rgba(var(--accent-blue-rgb), 0.4);
border-left: 4px solid var(--accent-blue);
border-radius: var(--radius-md);
padding: 1.25rem 1.5rem;
margin: 1.25rem 0 1.75rem 0;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.formula-title {
font-size: 0.775rem;
text-transform: uppercase;
letter-spacing: 0.06em;
font-weight: 700;
color: var(--accent-blue);
}
.formula-math {
font-size: 1.15rem;
font-weight: 700;
color: var(--text-primary);
font-family: 'JetBrains Mono', monospace;
}
/* Modern Tables */
.table-responsive {
overflow-x: auto;
border-radius: var(--radius-md);
border: 1px solid var(--border-subtle);
background: var(--bg-surface);
margin: 1.5rem 0;
}
table {
width: 100%;
border-collapse: collapse;
text-align: left;
font-size: 0.925rem;
}
thead th {
background: var(--bg-surface-elevated);
color: var(--text-primary);
font-weight: 700;
padding: 0.85rem 1.25rem;
border-bottom: 1px solid var(--border-subtle);
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.05em;
}
tbody td {
padding: 0.85rem 1.25rem;
border-bottom: 1px solid var(--border-subtle);
color: var(--text-secondary);
}
tbody tr:last-child td {
border-bottom: none;
}
tbody tr:hover {
background: rgba(255, 255, 255, 0.02);
}
[data-theme="light"] tbody tr:hover {
background: rgba(0, 0, 0, 0.02);
}
.highlight-row {
background: rgba(var(--accent-blue-rgb), 0.08) !important;
font-weight: 600;
}
.highlight-row td {
color: var(--text-primary);
}
.badge {
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.2rem 0.6rem;
border-radius: 9999px;
font-size: 0.75rem;
font-weight: 600;
}
.badge-primary {
background: rgba(56, 189, 248, 0.15);
color: var(--accent-blue);
border: 1px solid rgba(56, 189, 248, 0.3);
}
.badge-emerald {
background: rgba(16, 185, 129, 0.15);
color: var(--accent-emerald);
border: 1px solid rgba(16, 185, 129, 0.3);
}
.badge-amber {
background: rgba(245, 158, 11, 0.15);
color: var(--accent-amber);
border: 1px solid rgba(245, 158, 11, 0.3);
}
/* Interactive Comparison Chart */
.chart-container {
background: var(--bg-surface-elevated);
border-radius: var(--radius-md);
padding: 1.5rem;
margin: 1.5rem 0;
border: 1px solid var(--border-subtle);
}
.chart-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.25rem;
flex-wrap: wrap;
gap: 0.75rem;
}
.chart-legend {
display: flex;
gap: 1rem;
font-size: 0.8rem;
}
.legend-item {
display: flex;
align-items: center;
gap: 0.4rem;
color: var(--text-secondary);
}
.legend-dot {
width: 10px;
height: 10px;
border-radius: 50%;
}
.bar-group {
margin-bottom: 1.25rem;
}
.bar-label-wrap {
display: flex;
justify-content: space-between;
margin-bottom: 0.4rem;
font-size: 0.85rem;
}
.bar-system-name {
font-weight: 600;
color: var(--text-primary);
}
.bar-val {
font-family: 'JetBrains Mono', monospace;
font-weight: 700;
color: var(--accent-blue);
}
.bar-track {
height: 12px;
background: rgba(255, 255, 255, 0.06);
border-radius: 9999px;
overflow: hidden;
position: relative;
}
[data-theme="light"] .bar-track {
background: rgba(0, 0, 0, 0.08);
}
.bar-fill {
height: 100%;
border-radius: 9999px;
transition: width 1s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
}
/* Visual comparison scale markers */
.reference-line {
position: absolute;
top: 0;
bottom: 0;
width: 2px;
background: var(--accent-rose);
z-index: 2;
}
/* Grid cards for 2-col analysis */
.grid-2 {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 1.5rem;
margin: 1.5rem 0;
}
.sub-card {
background: var(--bg-surface-elevated);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: 1.5rem;
}
.sub-card h3 {
font-size: 1.15rem;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 0.5rem;
}
/* Callout & Quotes */
.callout {
border-left: 4px solid var(--accent-amber);
background: rgba(245, 158, 11, 0.08);
border-radius: 0 var(--radius-md) var(--radius-md) 0;
padding: 1.25rem 1.5rem;
margin: 1.5rem 0;
}
.callout-title {
font-weight: 700;
color: var(--accent-amber);
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.05em;
margin-bottom: 0.35rem;
display: flex;
align-items: center;
gap: 0.4rem;
}
.callout p {
margin-bottom: 0;
color: var(--text-primary);
font-size: 0.95rem;
}
.quote-hero {
background: linear-gradient(135deg, rgba(56, 189, 248, 0.12) 0%, rgba(99, 102, 241, 0.12) 100%);
border: 1px solid rgba(56, 189, 248, 0.3);
border-radius: var(--radius-md);
padding: 1.5rem;
margin: 1.5rem 0;
text-align: center;
}
.quote-hero blockquote {
font-size: 1.25rem;
font-weight: 700;
color: var(--accent-blue);
letter-spacing: -0.01em;
}
/* Criteria Cards */
.criteria-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 1rem;
margin: 1.25rem 0 1.75rem 0;
}
.criteria-card {
background: var(--bg-surface-elevated);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: 1.25rem;
position: relative;
overflow: hidden;
}
.criteria-tag {
font-size: 0.725rem;
font-weight: 700;
text-transform: uppercase;
padding: 0.2rem 0.5rem;
border-radius: 4px;
display: inline-block;
margin-bottom: 0.75rem;
}
.tag-blue { background: rgba(56, 189, 248, 0.15); color: var(--accent-blue); }
.tag-emerald { background: rgba(16, 185, 129, 0.15); color: var(--accent-emerald); }
.tag-indigo { background: rgba(99, 102, 241, 0.15); color: var(--accent-indigo); }
.criteria-card h4 {
font-size: 1.05rem;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 0.35rem;
}
.criteria-card p {
font-size: 0.85rem;
margin-bottom: 0;
}
/* Interactive Calculator Card */
.calc-card {
background: linear-gradient(135deg, rgba(17, 22, 34, 0.95), rgba(24, 32, 48, 0.95));
border: 1px solid rgba(56, 189, 248, 0.3);
border-radius: var(--radius-lg);
padding: 2rem;
margin: 2rem 0;
box-shadow: 0 12px 30px rgba(0,0,0,0.3);
}
[data-theme="light"] .calc-card {
background: linear-gradient(135deg, #ffffff, #f8fafc);
border: 1px solid rgba(2, 132, 199, 0.25);
}
.calc-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 1.25rem;
margin-top: 1.25rem;
}
.input-group {
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.input-label {
font-size: 0.8rem;
font-weight: 600;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.04em;
}
.input-control {
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-sm);
padding: 0.65rem 0.9rem;
color: var(--text-primary);
font-family: 'JetBrains Mono', monospace;
font-size: 0.95rem;
outline: none;
transition: border-color 0.2s ease;
}
.input-control:focus {
border-color: var(--accent-blue);
box-shadow: 0 0 0 3px rgba(var(--accent-blue-rgb), 0.15);
}
.calc-results {
margin-top: 1.5rem;
padding: 1.25rem;
background: var(--bg-surface-elevated);
border-radius: var(--radius-md);
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 1rem;
border: 1px solid var(--border-subtle);
}
.calc-res-item {
text-align: center;
}
.calc-res-title {
font-size: 0.75rem;
color: var(--text-muted);
text-transform: uppercase;
font-weight: 600;
}
.calc-res-num {
font-size: 1.45rem;
font-weight: 800;
color: var(--accent-blue);
font-family: 'JetBrains Mono', monospace;
margin-top: 0.2rem;
}
/* Aberration checklist */
.checklist {
list-style: none;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
gap: 0.85rem;
margin: 1.25rem 0;
}
.check-item {
display: flex;
align-items: flex-start;
gap: 0.65rem;
padding: 0.75rem 1rem;
background: var(--bg-surface-elevated);
border-radius: var(--radius-sm);
border: 1px solid var(--border-subtle);
font-size: 0.9rem;
color: var(--text-primary);
}
.check-icon {
color: var(--accent-amber);
flex-shrink: 0;
margin-top: 2px;
}
/* Selected config badge banner */
.banner-selected {
background: linear-gradient(135deg, rgba(16, 185, 129, 0.12) 0%, rgba(56, 189, 248, 0.1) 100%);
border: 1px solid rgba(16, 185, 129, 0.4);
border-radius: var(--radius-lg);
padding: 2rem;
margin: 2rem 0;
}
.config-specs {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
margin-top: 1.25rem;
}
.spec-box {
background: var(--bg-surface);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: 1rem;
}
.spec-label {
font-size: 0.75rem;
color: var(--text-muted);
text-transform: uppercase;
font-weight: 600;
}
.spec-val {
font-size: 1.15rem;
font-weight: 700;
color: var(--text-primary);
margin-top: 0.25rem;
font-family: 'JetBrains Mono', monospace;
}
/* Print Styles */
@media print {
body {
background: #ffffff !important;
color: #000000 !important;
}
.sidebar, .top-actions, .calc-card {
display: none !important;
}
.app-container {
grid-template-columns: 1fr !important;
}
.main-content {
padding: 0 !important;
}
.section-card {
border: 1px solid #ccc !important;
box-shadow: none !important;
page-break-inside: avoid;
}
}
/* Responsive */
@media (max-width: 1024px) {
.app-container {
grid-template-columns: 1fr;
}
.sidebar {
display: none;
}
.main-content {
padding: 1.5rem;
}
}
</style>
</head>
<body>
<div class="app-container">
<!-- Sidebar Navigation -->
<aside class="sidebar" id="sidebar">
<div class="brand-badge">
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><circle cx="12" cy="12" r="10"/><path d="m4.93 4.93 4.24 4.24"/><path d="m14.83 9.17 4.24-4.24"/><path d="m14.83 14.83 4.24 4.24"/><path d="m9.17 14.83-4.24 4.24"/></svg>
Metrología Visual
</div>
<h2 class="sidebar-title">Resolución Óptica & Visión Humana</h2>
<ul class="nav-list">
<li><a href="#sec-1" class="nav-link"><span class="nav-num">01</span> Ojo Humano</a></li>
<li><a href="#sec-2" class="nav-link"><span class="nav-num">02</span> Cámara Digital</a></li>
<li><a href="#sec-3" class="nav-link"><span class="nav-num">03</span> MeltTools PIXI</a></li>
<li><a href="#sec-4" class="nav-link"><span class="nav-num">04</span> Basler ace 2 R</a></li>
<li><a href="#sec-5" class="nav-link"><span class="nav-num">05</span> Comparativa Directa</a></li>
<li><a href="#sec-6" class="nav-link"><span class="nav-num">06</span> Análisis de Lentes</a></li>
<li><a href="#sec-7" class="nav-link"><span class="nav-num">07</span> Factores & Aberraciones</a></li>
<li><a href="#sec-8" class="nav-link"><span class="nav-num">08</span> Configuración Elegida</a></li>
<li><a href="#sec-calc" class="nav-link"><span class="nav-num">09</span> Simulador Interactivo</a></li>
</ul>
<div class="sidebar-footer">
<div style="font-size: 0.75rem; color: var(--text-muted);">
Informe Técnico de Metrología e Inspección Industrial
</div>
</div>
</aside>
<!-- Main Content Area -->
<main class="main-content">
<!-- Top Action Bar -->
<header class="top-actions">
<button class="btn" id="themeToggle" onclick="toggleTheme()" title="Cambiar tema">
<svg id="themeIcon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M1 12h2M21 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4"/></svg>
<span id="themeLabel">Modo Claro</span>
</button>
<button class="btn btn-primary" onclick="window.print()" title="Imprimir / Exportar a PDF">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 6 2 18 2 18 9"/><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"/><rect x="6" y="14" width="12" height="8"/></svg>
Imprimir / PDF
</button>
</header>
<!-- Hero Section -->
<section class="hero">
<div class="hero-tag">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>
Estudio Técnico Comparativo
</div>
<h1 class="hero-title">Comparación de resolución visual humana y sistemas de cámaras</h1>
<p class="hero-subtitle">
Evaluación cuantitativa entre la agudeza visual humana de referencia y la capacidad de resolución espacial de cámaras industriales MeltTools PIXI y Basler ace 2 R para inspección de defectos.
</p>
<div class="hero-stats">
<div class="stat-card">
<div class="stat-label">Referencia Ojo Humano (40a)</div>
<div class="stat-val">≈ 58 µm</div>
<div class="stat-desc">A 20 cm de distancia de enfoque (1 arcmin)</div>
</div>
<div class="stat-card">
<div class="stat-label">Basler ace 2 R (5 px)</div>
<div class="stat-val">56,3 µm</div>
<div class="stat-desc">WD 300 mm, HFOV 60 mm (11,26 µm/px)</div>
</div>
<div class="stat-card">
<div class="stat-label">MeltTools PIXI (5 px)</div>
<div class="stat-val">182 µm</div>
<div class="stat-desc">WD 200 mm, HFOV 70 mm (36,5 µm/px)</div>
</div>
<div class="stat-card">
<div class="stat-label">Sensor Basler 25 MP</div>
<div class="stat-val">5328×4608</div>
<div class="stat-desc">Píxel físico de 2,71 µm</div>
</div>
</div>
</section>
<!-- 1. Resolución del ojo humano -->
<section id="sec-1" class="section-card">
<div class="section-header">
<div class="section-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>
</div>
<div class="section-title-wrap">
<h2>1. Resolución del ojo humano</h2>
<p>Límites fisiológicos y dependencia de la distancia y edad</p>
</div>
</div>
<p>
Para establecer una referencia objetiva, se considera una persona con <strong>agudeza visual normal (20/20)</strong>. Como aproximación, el ojo humano puede resolver detalles separados angularmente aproximadamente <strong>1 minuto de arco (1 arcmin = 1/60°)</strong>.
</p>
<p>
La resolución expresada en micrones no es un valor fijo, ya que depende directamente de la distancia de observación. A menor distancia, el ojo puede distinguir detalles físicamente más pequeños sobre la superficie.
</p>
<div class="formula-box">
<span class="formula-title">Relación matemática de resolución angular</span>
<span class="formula-math">Tamaño mínimo resoluble ≈ Distancia × tan(1 arcmin)</span>
</div>
<h3 style="font-size: 1.15rem; font-weight: 700; margin: 1.5rem 0 0.5rem 0; color: var(--text-primary);">
Distancia mínima de enfoque según la edad
</h3>
<p>
La capacidad de enfocar objetos cercanos disminuye progresivamente con la edad debido a la pérdida de acomodación del cristalino (presbicia). Valores aproximados de referencia:
</p>
<div class="table-responsive">
<table>
<thead>
<tr>
<th style="width: 25%;">Edad</th>
<th style="width: 40%;">Distancia mínima de enfoque aprox.</th>
<th style="width: 35%;">Detalle resoluble a esa distancia</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>20 años</strong></td>
<td>10 cm</td>
<td><span class="badge badge-emerald">29 µm</span></td>
</tr>
<tr>
<td><strong>30 años</strong></td>
<td>14 cm</td>
<td><span class="badge badge-emerald">41 µm</span></td>
</tr>
<tr class="highlight-row">
<td><strong>40 años (Referencia)</strong></td>
<td>20 cm</td>
<td><span class="badge badge-primary">58 µm</span></td>
</tr>
<tr>
<td><strong>50 años</strong></td>
<td>50 cm</td>
<td><span class="badge badge-amber">145 µm</span></td>
</tr>
<tr>
<td><strong>60 años</strong></td>
<td>100 cm</td>
<td><span class="badge badge-amber">291 µm</span></td>
</tr>
</tbody>
</table>
</div>
<p>
Los valores corresponden al límite de resolución angular de aproximadamente 1 arcmin. No significan necesariamente que un defecto de ese tamaño vaya a ser detectado en una inspección real, ya que también influyen el contraste, la iluminación, la forma del defecto y la agudeza visual individual.
</p>
<div class="callout">
<div class="callout-title">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
Referencia Práctica Adoptada
</div>
<p>
<strong>Persona de aproximadamente 40 años → distancia mínima de enfoque ≈ 20 cm → resolución ≈ 58 µm.</strong>
</p>
</div>
</section>
<!-- 2. Resolución de una cámara digital -->
<section id="sec-2" class="section-card">
<div class="section-header">
<div class="section-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>
</div>
<div class="section-title-wrap">
<h2>2. Resolución de una cámara digital</h2>
<p>Muestreo espacial y criterios de detección de defectos</p>
</div>
</div>
<p>
En una cámara digital, primero se determina la resolución espacial proyectada sobre el objeto:
</p>
<div class="formula-box">
<span class="formula-title">Resolución espacial en el plano del objeto</span>
<span class="formula-math">Resolución [µm/píxel] = HFOV [µm] / Cantidad de píxeles horizontales</span>
</div>
<p>
Luego puede determinarse cuántos píxeles ocupa un determinado defecto. Para evaluar la representación de un defecto se consideran tres criterios estándar en visión artificial:
</p>
<div class="criteria-grid">
<div class="criteria-card">
<span class="criteria-tag tag-blue">2 Píxeles / Defecto</span>
<h4>Límite de muestreo</h4>
<p>Criterio teórico de Nyquist. Permite detección básica de presencia de señal, pero no forma ni bordes.</p>
</div>
<div class="criteria-card">
<span class="criteria-tag tag-emerald">5 Píxeles / Defecto</span>
<h4>Inspección práctica</h4>
<p>Criterio industrial estándar para una representación geométrica adecuada del defecto y mediciones reproducibles.</p>
</div>
<div class="criteria-card">
<span class="criteria-tag tag-indigo">8 Píxeles / Defecto</span>
<h4>Inspección exigente</h4>
<p>Criterio conservador que garantiza excelente caracterización de forma, bordes y clasificación avanzada.</p>
</div>
</div>
<div class="callout" style="border-left-color: var(--accent-rose); background: rgba(244, 63, 94, 0.08);">
<div class="callout-title" style="color: var(--accent-rose);">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>
Advertencia de Muestreo Teórico
</div>
<p>
El criterio de 2 píxeles representa un <strong>límite matemático de muestreo</strong> y no debe interpretarse como una recomendación de calidad de imagen para inspección fiable de calidad.
</p>
</div>
</section>
<!-- 3. Cámara Full HD MeltTools PIXI -->
<section id="sec-3" class="section-card">
<div class="section-header">
<div class="section-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="m9 8 6 4-6 4Z"/></svg>
</div>
<div class="section-title-wrap">
<h2>3. Cámara Full HD MeltTools PIXI</h2>
<p>Sensor 1920 × 1080 px con lente óptica de 12 mm</p>
</div>
</div>
<p>
Como cámara Full HD de referencia se considera la <strong>MeltTools MeltView PIXI</strong>, que proporciona una imagen de <strong>1920 × 1080 píxeles</strong> con salida HD-SDI. MeltTools ofrece variantes de la PIXI con óptica de <strong>12 mm</strong>, entre otras configuraciones.
</p>
<div class="grid-2">
<!-- 3.1 -->
<div class="sub-card">
<h3>3.1. WD = 200 mm</h3>
<p>Campo horizontal <strong>HFOV = 70 mm</strong></p>
<div class="formula-box" style="margin: 0.5rem 0 1rem 0; padding: 0.75rem 1rem;">
<span class="formula-math" style="font-size: 0.95rem;">70.000 µm / 1920 = 36,5 µm/píxel</span>
</div>
<div class="table-responsive" style="margin: 0;">
<table>
<thead>
<tr>
<th>Criterio</th>
<th style="text-align: right;">Píxeles</th>
<th style="text-align: right;">Defecto</th>
</tr>
</thead>
<tbody>
<tr>
<td>Límite de muestreo</td>
<td style="text-align: right;">2 px</td>
<td style="text-align: right;"><strong>73 µm</strong></td>
</tr>
<tr class="highlight-row">
<td>Inspección práctica</td>
<td style="text-align: right;">5 px</td>
<td style="text-align: right;"><strong>182 µm</strong></td>
</tr>
<tr>
<td>Inspección exigente</td>
<td style="text-align: right;">8 px</td>
<td style="text-align: right;"><strong>292 µm</strong></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 3.2 -->
<div class="sub-card">
<h3>3.2. WD = 300 mm</h3>
<p>Campo horizontal <strong>HFOV = 100 mm</strong></p>
<div class="formula-box" style="margin: 0.5rem 0 1rem 0; padding: 0.75rem 1rem;">
<span class="formula-math" style="font-size: 0.95rem;">100.000 µm / 1920 = 52,1 µm/píxel</span>
</div>
<div class="table-responsive" style="margin: 0;">
<table>
<thead>
<tr>
<th>Criterio</th>
<th style="text-align: right;">Píxeles</th>
<th style="text-align: right;">Defecto</th>
</tr>
</thead>
<tbody>
<tr>
<td>Límite de muestreo</td>
<td style="text-align: right;">2 px</td>
<td style="text-align: right;"><strong>104 µm</strong></td>
</tr>
<tr class="highlight-row">
<td>Inspección práctica</td>
<td style="text-align: right;">5 px</td>
<td style="text-align: right;"><strong>260 µm</strong></td>
</tr>
<tr>
<td>Inspección exigente</td>
<td style="text-align: right;">8 px</td>
<td style="text-align: right;"><strong>417 µm</strong></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</section>
<!-- 4. Cámara Basler ace 2 R a2A5328-4gcPRO -->
<section id="sec-4" class="section-card">
<div class="section-header">
<div class="section-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 2 7 12 12 22 7 12 2"/><polyline points="2 17 12 22 22 17"/><polyline points="2 12 12 17 22 12"/></svg>
</div>
<div class="section-title-wrap">
<h2>4. Cámara Basler ace 2 R a2A5328-4gcPRO</h2>
<p>Sensor de ultra alta resolución 24,5 MP (5328 × 4608 px)</p>
</div>
</div>
<p>
Se evalúa la cámara industrial <strong>Basler ace 2 R a2A5328-4gcPRO</strong> con sensor de <strong>5328 × 4608 píxeles</strong>. La configuración bajo análisis considera:
</p>
<div style="display: flex; gap: 1rem; flex-wrap: wrap; margin-bottom: 1.25rem;">
<span class="badge badge-primary">Distancia de trabajo (WD): 300 mm</span>
<span class="badge badge-primary">Campo horizontal (HFOV): 60 mm</span>
<span class="badge badge-emerald">Resolución espacial: 11,26 µm/píxel</span>
</div>
<div class="formula-box">
<span class="formula-title">Cálculo de resolución sobre el objeto</span>
<span class="formula-math">60.000 µm / 5328 px = 11,26 µm/píxel</span>
</div>
<div class="table-responsive">
<table>
<thead>
<tr>
<th>Criterio</th>
<th style="text-align: right;">Píxeles por defecto</th>
<th style="text-align: right;">Tamaño del defecto</th>
<th>Evaluación respecto al Ojo Humano (58 µm)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Límite de muestreo</strong></td>
<td style="text-align: right;">2 px</td>
<td style="text-align: right; color: var(--accent-emerald);"><strong>22,5 µm</strong></td>
<td>Sub-resolución del ojo (supera ampliamente el umbral visual)</td>
</tr>
<tr class="highlight-row">
<td><strong>Inspección práctica</strong></td>
<td style="text-align: right;">5 px</td>
<td style="text-align: right; color: var(--accent-blue);"><strong>56,3 µm</strong></td>
<td><strong>Equivalente al ojo humano (58 µm)</strong></td>
</tr>
<tr>
<td><strong>Inspección exigente</strong></td>
<td style="text-align: right;">8 px</td>
<td style="text-align: right;"><strong>90,1 µm</strong></td>
<td>Excelente definición morfológica y segmentación de bordes</td>
</tr>
</tbody>
</table>
</div>
<h3 style="font-size: 1.15rem; font-weight: 700; margin: 1.5rem 0 0.5rem 0; color: var(--text-primary);">
Especificaciones Ópticas: Lente Basler C12-5024-25M
</h3>
<p>
Esta configuración utiliza la lente <strong>Basler C12-5024-25M</strong>, una óptica C-mount de <strong>50 mm</strong>, F2.4–F16, diseñada específicamente para sensores de hasta <strong>25 MP</strong>.
</p>
<ul style="margin-left: 1.5rem; color: var(--text-secondary); margin-bottom: 1.25rem;">
<li><strong>Círculo de imagen:</strong> 19,3 mm (formato 1,2").</li>
<li><strong>Resolución óptica de diseño:</strong> 184 LP/mm para tamaño de píxel de 2,71 µm.</li>
<li><strong>Rango de enfoque:</strong> Desde 200 mm hasta infinito.</li>
<li><strong>Curvas de MTF (F2.4 @ WD 450 mm):</strong>
<ul style="margin-top: 0.35rem; margin-left: 1.2rem;">
<li><strong>Centro del campo:</strong> MTF ≈ 0,53 a 140 LP/mm y 0,38 a 200 LP/mm.</li>
<li><strong>Zona periférica (80% del campo):</strong> MTF ≈ 0,51 a 140 LP/mm y 0,36 a 200 LP/mm.</li>
</ul>
</li>
</ul>
</section>
<!-- 5. Comparación con la capacidad visual humana -->
<section id="sec-5" class="section-card">
<div class="section-header">
<div class="section-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="20" x2="18" y2="10"/><line x1="12" y1="20" x2="12" y2="4"/><line x1="6" y1="20" x2="6" y2="14"/></svg>
</div>
<div class="section-title-wrap">
<h2>5. Comparación con la capacidad visual humana</h2>
<p>Confrontación directa de umbrales resolutivos</p>
</div>
</div>
<p>
Tomando como referencia a una persona de 40 años enfocando a 20 cm (resolución angular de 1 arcmin ≈ <strong>58 µm</strong>), la comparativa global queda estructurada de la siguiente manera:
</p>
<!-- Dynamic Chart -->
<div class="chart-container">
<div class="chart-header">
<h4 style="font-weight: 700; color: var(--text-primary);">Comparativa de tamaño mínimo de defecto detectable (µm)</h4>
<div class="chart-legend">
<span class="legend-item"><span class="legend-dot" style="background: var(--accent-rose);"></span> Ref. Ojo 58 µm</span>
<span class="legend-item"><span class="legend-dot" style="background: var(--accent-emerald);"></span> Basler ace 2 R</span>
<span class="legend-item"><span class="legend-dot" style="background: var(--accent-amber);"></span> MeltTools PIXI</span>
</div>
</div>
<!-- Chart bars -->
<div class="bar-group">
<div class="bar-label-wrap">
<span class="bar-system-name">Ojo humano (20 cm, 20/20) [Límite angular de referencia]</span>
<span class="bar-val" style="color: var(--accent-rose);">58 µm</span>
</div>
<div class="bar-track">
<div class="bar-fill" style="width: 22.3%; background: var(--accent-rose);"></div>
</div>
</div>
<div class="bar-group">
<div class="bar-label-wrap">
<span class="bar-system-name">Basler ace 2 R — WD 300 mm, HFOV 60 mm (2 px - Teórico)</span>
<span class="bar-val">22,5 µm</span>
</div>
<div class="bar-track">
<div class="bar-fill" style="width: 8.6%; background: var(--accent-emerald);"></div>
</div>
</div>
<div class="bar-group">
<div class="bar-label-wrap">
<span class="bar-system-name">Basler ace 2 R — WD 300 mm, HFOV 60 mm (5 px - Inspección Práctica)</span>
<span class="bar-val" style="color: var(--accent-emerald);">56,3 µm (Equivalente al ojo)</span>
</div>
<div class="bar-track">
<div class="bar-fill" style="width: 21.6%; background: var(--accent-emerald);"></div>
</div>
</div>
<div class="bar-group">
<div class="bar-label-wrap">
<span class="bar-system-name">Basler ace 2 R — WD 300 mm, HFOV 60 mm (8 px - Exigente)</span>
<span class="bar-val">90,1 µm</span>
</div>
<div class="bar-track">
<div class="bar-fill" style="width: 34.6%; background: var(--accent-emerald); opacity: 0.8;"></div>
</div>
</div>
<div class="bar-group">
<div class="bar-label-wrap">
<span class="bar-system-name">MeltTools PIXI — WD 200 mm, HFOV 70 mm (2 px)</span>
<span class="bar-val">73 µm</span>
</div>
<div class="bar-track">
<div class="bar-fill" style="width: 28%; background: var(--accent-amber);"></div>
</div>
</div>
<div class="bar-group">
<div class="bar-label-wrap">
<span class="bar-system-name">MeltTools PIXI — WD 200 mm, HFOV 70 mm (5 px - Práctico)</span>
<span class="bar-val">182 µm</span>
</div>
<div class="bar-track">
<div class="bar-fill" style="width: 70%; background: var(--accent-amber);"></div>
</div>
</div>
<div class="bar-group">
<div class="bar-label-wrap">
<span class="bar-system-name">MeltTools PIXI — WD 300 mm, HFOV 100 mm (5 px - Práctico)</span>
<span class="bar-val">260 µm</span>
</div>
<div class="bar-track">
<div class="bar-fill" style="width: 100%; background: var(--accent-amber); opacity: 0.7;"></div>
</div>
</div>
<div style="font-size: 0.75rem; color: var(--text-muted); margin-top: 0.5rem; text-align: right;">
* Barras menores indican mayor capacidad de detectar detalles más finos.
</div>
</div>
<div class="table-responsive">
<table>
<thead>
<tr>
<th>Sistema</th>
<th>Condición</th>
<th style="text-align: right;">Resolución / Defecto</th>
<th>Rendimiento Relativo</th>
</tr>
</thead>
<tbody>
<tr class="highlight-row">
<td><strong>Ojo humano</strong></td>
<td>20 cm, 20/20</td>
<td style="text-align: right; color: var(--accent-rose);"><strong>≈ 58 µm</strong></td>
<td><span class="badge" style="background: rgba(244,63,94,0.15); color: var(--accent-rose);">Línea Base</span></td>
</tr>
<tr>
<td><strong>MeltTools PIXI</strong></td>
<td>200 mm WD, 70 mm HFOV</td>
<td style="text-align: right;"><strong>73 µm</strong> (2 px)</td>
<td>Inferior al ojo humano</td>
</tr>
<tr>
<td><strong>MeltTools PIXI</strong></td>
<td>200 mm WD, 70 mm HFOV</td>
<td style="text-align: right;"><strong>182 µm</strong> (5 px)</td>
<td>3,1× peor que el ojo humano</td>
</tr>
<tr>
<td><strong>MeltTools PIXI</strong></td>
<td>300 mm WD, 100 mm HFOV</td>
<td style="text-align: right;"><strong>104 µm</strong> (2 px)</td>
<td>1,8× peor que el ojo humano</td>
</tr>
<tr>
<td><strong>MeltTools PIXI</strong></td>
<td>300 mm WD, 100 mm HFOV</td>
<td style="text-align: right;"><strong>260 µm</strong> (5 px)</td>
<td>4,5× peor que el ojo humano</td>
</tr>
<tr>
<td><strong>Basler ace 2 R</strong></td>
<td>300 mm WD, 60 mm HFOV</td>
<td style="text-align: right;"><strong>22,5 µm</strong> (2 px)</td>
<td>2,5× más fino que el ojo (teórico)</td>
</tr>
<tr class="highlight-row">
<td><strong>Basler ace 2 R</strong></td>
<td>300 mm WD, 60 mm HFOV</td>
<td style="text-align: right; color: var(--accent-emerald);"><strong>56,3 µm</strong> (5 px)</td>
<td><span class="badge badge-emerald">Equivalencia Práctica Directa (≈ 58 µm)</span></td>
</tr>
<tr>
<td><strong>Basler ace 2 R</strong></td>
<td>300 mm WD, 60 mm HFOV</td>
<td style="text-align: right;"><strong>90,1 µm</strong> (8 px)</td>
<td>Inspección de alta confiabilidad</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- 6. Comparación de las lentes -->
<section id="sec-6" class="section-card">
<div class="section-header">
<div class="section-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
</div>
<div class="section-title-wrap">
<h2>6. Comparación de las lentes</h2>
<p>Distancia focal vs. Calidad óptica y función de transferencia de modulación</p>
</div>
</div>
<p>
La cámara MeltTools PIXI considerada utiliza una óptica de <strong>12 mm</strong>, mientras que la configuración Basler utiliza la <strong>Basler C12-5024-25M de 50 mm</strong>. MeltTools confirma la disponibilidad de la variante PIXI de 12 mm, mientras que Basler especifica para la C12-5024-25M una distancia focal de 50 mm y una resolución óptica de diseño de 184 LP/mm.
</p>
<div class="callout" style="border-left-color: var(--accent-indigo); background: rgba(99, 102, 241, 0.08);">
<div class="callout-title" style="color: var(--accent-indigo);">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>
Error Conceptual Habitual
</div>
<p>
<strong>No es correcto concluir que la lente Basler es mejor simplemente porque tiene 50 mm frente a 12 mm.</strong> La distancia focal determina principalmente el campo de visión (HFOV) junto con el tamaño del sensor y la distancia de trabajo. La capacidad real de resolver detalles depende además de la calidad óptica intrínseca, curvas de MTF, apertura, aberraciones, enfoque, sensor y condiciones de iluminación.
</p>
</div>
<p>
En particular, para la lente Basler C12-5024-25M se dispone de información óptica cuantitativa oficial provista por el fabricante, incluyendo MTF, distorsión y resolución de diseño. Para la óptica de 12 mm de la PIXI no se dispone, en la documentación pública consultada, de información equivalente de MTF que permita realizar una comparación cuantitativa directa entre ambas lentes.
</p>
<p>
Por este motivo, los cálculos de µm/píxel realizados anteriormente deben considerarse <strong>resolución geométrica de muestreo</strong>, y no una garantía de que la óptica sea capaz de reproducir físicamente ese detalle en su totalidad.
</p>
</section>
<!-- 7. Influencia de las aberraciones ópticas y otros factores -->
<section id="sec-7" class="section-card">
<div class="section-header">
<div class="section-icon">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"/></svg>
</div>
<div class="section-title-wrap">
<h2>7. Influencia de las aberraciones ópticas y otros factores</h2>
<p>Factores que degradan la resolución teórica en entornos reales</p>
</div>
</div>
<p>
La resolución calculada a partir de HFOV y cantidad de píxeles supone implícitamente que cada píxel representa correctamente la información óptica correspondiente. En un sistema real esto <strong>no ocurre de manera ideal</strong>.
</p>
<p>Las <strong>aberraciones de la lente</strong> reducen la capacidad real de resolución de detalle fino:</p>
<ul class="checklist">
<li class="check-item">
<svg class="check-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<span><strong>Aberración esférica:</strong> Pérdida de nitidez puntual en el plano focal</span>
</li>
<li class="check-item">
<svg class="check-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<span><strong>Coma y Astigmatismo:</strong> Deformación de puntos luminosos fuera del eje</span>
</li>
<li class="check-item">
<svg class="check-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<span><strong>Curvatura de campo:</strong> El plano focal adquiere forma curva no plana</span>
</li>
<li class="check-item">
<svg class="check-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<span><strong>Aberración cromática:</strong> Dispersión de longitudes de onda de la luz</span>
</li>
<li class="check-item">
<svg class="check-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<span><strong>Distorsión geométrica:</strong> Deformación en barril o cojín</span>
</li>
<li class="check-item">
<svg class="check-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>
<span><strong>Caída en bordes:</strong> Pérdida progresiva de MTF hacia los extremos</span>
</li>
</ul>
<p>
Además, la resolución real del sistema depende de la <strong>MTF de la lente</strong>, el sensor (diafonía entre píxeles, ruido térmico y de disparo), el enfoque exacto, la apertura utilizada (límite por difracción a números f altos), la iluminación estroboscópica o continua, el contraste del defecto frente al fondo y eventualmente el movimiento relativo de la pieza.
</p>
<div class="quote-hero">
<blockquote>« µm/píxel no es equivalente a µm de resolución óptica real. »</blockquote>
<p style="font-size: 0.85rem; color: var(--text-secondary); margin-top: 0.5rem; margin-bottom: 0;">
La cifra de µm/píxel indica cuánto mide un píxel proyectado sobre el objeto. Determinar si realmente se resuelve el defecto requiere considerar la óptica y la MTF conjunta cámara + lente.
</p>
</div>
</section>
<!-- 8. Configuración seleccionada para el proyecto -->
<section id="sec-8" class="section-card">
<div class="section-header">
<div class="section-icon" style="background: rgba(16, 185, 129, 0.15); color: var(--accent-emerald);">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
</div>
<div class="section-title-wrap">
<h2>8. Configuración seleccionada para el proyecto</h2>
<p>Parámetros finales adoptados para la celda de inspección</p>
</div>
</div>
<div class="banner-selected">
<span class="badge badge-emerald" style="margin-bottom: 0.75rem;">Configuración Oficial Recomendada</span>
<h3 style="font-size: 1.45rem; font-weight: 800; color: var(--text-primary);">Basler ace 2 R a2A5328-4gcPRO</h3>
<p style="margin-top: 0.35rem; font-size: 0.95rem;">
El HFOV de <strong>60 mm</strong> se define como el mínimo práctico para garantizar cobertura total de la zona de interés sin sacrificar resolución espacial.
</p>
<div class="config-specs">
<div class="spec-box">
<div class="spec-label">Resolución de Cámara</div>
<div class="spec-val">5328 × 4608 px</div>
</div>
<div class="spec-box">
<div class="spec-label">Lente Óptica</div>
<div class="spec-val">Basler 50 mm (C12)</div>
</div>
<div class="spec-box">
<div class="spec-label">Distancia de Trabajo (WD)</div>
<div class="spec-val">300 mm</div>
</div>
<div class="spec-box">
<div class="spec-label">Campo de Visión (HFOV)</div>
<div class="spec-val">60 mm</div>
</div>
<div class="spec-box">
<div class="spec-label">Resolución Geométrica</div>
<div class="spec-val" style="color: var(--accent-emerald);">11,26 µm/píxel</div>
</div>
<div class="spec-box">
<div class="spec-label">Criterio Adoptado</div>
<div class="spec-val">5 px / defecto</div>
</div>
</div>
</div>
<p>
Con el criterio de <strong>5 píxeles por defecto</strong>, la configuración de la Basler permite representar un defecto de aproximadamente <strong>56 µm</strong>, valor que empata de manera casi exacta los <strong>58 µm</strong> correspondientes al límite angular de resolución tomado como referencia para el ojo humano a 20 cm.
</p>
<div class="callout" style="border-left-color: var(--accent-blue); background: rgba(56, 189, 248, 0.08);">
<div class="callout-title" style="color: var(--accent-blue);">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
Nota de Validación Experimental
</div>
<p>
Esta equivalencia de 56 µm frente a 58 µm es una comparación de <strong>muestreo espacial geométrico</strong>, no una demostración estricta de que la cámara tenga la misma sensibilidad que la fóvea humana en cualquier espectro o contraste. Para validar definitivamente el sistema se recomienda verificar el desempeño real in-situ mediante una prueba con un patrón de calibración o diana óptica de resolución (e.g., target USAF 1951 / micro-regla certificada) de tamaño conocido.
</p>
</div>
</section>
<!-- 9. Simulador Interactivo -->
<section id="sec-calc" class="calc-card">
<div style="display: flex; align-items: center; gap: 0.75rem;">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="var(--accent-blue)" stroke-width="2"><rect width="16" height="20" x="4" y="2" rx="2"/><line x1="8" y1="6" x2="16" y2="6"/><line x1="16" y1="14" x2="16" y2="18"/><path d="M16 10h.01"/><path d="M12 10h.01"/><path d="M8 10h.01"/><path d="M12 14h.01"/><path d="M8 14h.01"/><path d="M12 18h.01"/><path d="M8 18h.01"/></svg>
<h2 style="font-size: 1.35rem; font-weight: 700; color: var(--text-primary);">Simulador Interactivo de Resolución y Defectos</h2>
</div>
<p style="font-size: 0.875rem; margin-top: 0.35rem; margin-bottom: 1.25rem;">
Modificá los parámetros ópticos en tiempo real para calcular al instante la resolución espacial proyectada y los umbrales de detección.
</p>
<div class="calc-grid">
<div class="input-group">
<label class="input-label" for="inp-hfov">HFOV - Campo Horizontal (mm)</label>
<input type="number" id="inp-hfov" class="input-control" value="60" min="1" max="2000" step="1" oninput="runCalculator()">
</div>
<div class="input-group">
<label class="input-label" for="inp-pixels">Píxeles Horizontales del Sensor</label>
<input type="number" id="inp-pixels" class="input-control" value="5328" min="100" max="20000" step="1" oninput="runCalculator()">
</div>
<div class="input-group">
<label class="input-label" for="inp-dist">Distancia Ojo Humano (cm)</label>
<input type="number" id="inp-dist" class="input-control" value="20" min="5" max="300" step="1" oninput="runCalculator()">
</div>
</div>
<div class="calc-results">
<div class="calc-res-item">
<div class="calc-res-title">Resolución Espacial</div>
<div class="calc-res-num" id="res-umpx">11,26 µm/px</div>
</div>
<div class="calc-res-item">
<div class="calc-res-title">Criterio 2 px (Nyquist)</div>
<div class="calc-res-num" id="res-2px">22,5 µm</div>
</div>
<div class="calc-res-item">
<div class="calc-res-title">Criterio 5 px (Práctico)</div>
<div class="calc-res-num" id="res-5px" style="color: var(--accent-emerald);">56,3 µm</div>
</div>
<div class="calc-res-item">
<div class="calc-res-title">Criterio 8 px (Exigente)</div>
<div class="calc-res-num" id="res-8px">90,1 µm</div>
</div>
<div class="calc-res-item">
<div class="calc-res-title">Ojo Humano (Dist. Ingresada)</div>
<div class="calc-res-num" id="res-eye" style="color: var(--accent-rose);">58,2 µm</div>
</div>
</div>
</section>
<!-- Document Footer -->
<footer style="margin-top: 4rem; padding-top: 2rem; border-top: 1px solid var(--border-subtle); display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 1rem; color: var(--text-muted); font-size: 0.8rem;">
<div>
<strong>Documento Técnico de Visión Artificial</strong> &bull; Basler ace 2 R vs MeltTools PIXI vs Ojo Humano
</div>
<div>
Generado para análisis e ingeniería de procesos de inspección
</div>
</footer>
</main>
</div>
<script>
// Theme Toggle Logic
function toggleTheme() {
const currentTheme = document.documentElement.getAttribute('data-theme');
const newTheme = currentTheme === 'light' ? 'dark' : 'light';
document.documentElement.setAttribute('data-theme', newTheme);
localStorage.setItem('doc-theme', newTheme);
updateThemeUI(newTheme);
}
function updateThemeUI(theme) {
const label = document.getElementById('themeLabel');
const icon = document.getElementById('themeIcon');
if (theme === 'light') {
label.textContent = 'Modo Oscuro';
icon.innerHTML = '<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/>';
} else {
label.textContent = 'Modo Claro';
icon.innerHTML = '<circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M1 12h2M21 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4"/>';
}
}
// Interactive Calculator
function runCalculator() {
const hfovMm = parseFloat(document.getElementById('inp-hfov').value) || 60;
const pixels = parseFloat(document.getElementById('inp-pixels').value) || 5328;
const distCm = parseFloat(document.getElementById('inp-dist').value) || 20;
const hfovUm = hfovMm * 1000;
const umPerPx = hfovUm / pixels;
const res2px = umPerPx * 2;
const res5px = umPerPx * 5;
const res8px = umPerPx * 8;
// 1 arcmin in radians = (1 / 60) * (PI / 180)
const arcminRad = (1 / 60) * (Math.PI / 180);
const eyeResUm = (distCm * 10000) * Math.tan(arcminRad);
document.getElementById('res-umpx').textContent = umPerPx.toFixed(2) + ' µm/px';
document.getElementById('res-2px').textContent = res2px.toFixed(1) + ' µm';
document.getElementById('res-5px').textContent = res5px.toFixed(1) + ' µm';
document.getElementById('res-8px').textContent = res8px.toFixed(1) + ' µm';
document.getElementById('res-eye').textContent = eyeResUm.toFixed(1) + ' µm';
}
// Navigation Active Observer
const navLinks = document.querySelectorAll('.nav-link');
const sections = document.querySelectorAll('section');
window.addEventListener('scroll', () => {
let current = '';
sections.forEach(section => {
const sectionTop = section.offsetTop;
const sectionHeight = section.clientHeight;
if (pageYOffset >= (sectionTop - 200)) {
current = section.getAttribute('id');
}
});
navLinks.forEach(link => {
link.classList.remove('active');
if (link.getAttribute('href') === '#' + current) {
link.classList.add('active');
}
});
});
// Init theme from preference
(function init() {
const savedTheme = localStorage.getItem('doc-theme') || 'dark';
document.documentElement.setAttribute('data-theme', savedTheme);
updateThemeUI(savedTheme);
runCalculator();
})();
</script>
</body>
</html>