Cómo utilizar los filtros de corrección de imagen

Hairil Hasyimi Bin Omar
Hairil Hasyimi Bin Omar
11 de octubre, 2023
Actualizado 17 de diciembre, 2024
Compartir:
This article was translated from English: Does it need improvement?
Translated
View the article in English

Seamos realistas. No todas las imágenes son perfectas, y este es también uno de los factores principales por los que una imagen de código de barras no puede ser leída por IronBarcode. Esto no es del todo culpa del usuario. En lugar de pasar por la molestia de volver a capturar la imagen o utilizar otro software de mejora de imágenes, IronBarcode ha ideado una función que permite a los usuarios aplicar filtros a la imagen mediante programación. Esto ayudaría a IronBarcode a leer la imagen y mejorar la precisión.

Continúe leyendo para conocer los filtros de corrección de imagen disponibles en IronBarcode, sus efectos sobre las imágenes y cómo aplicarlos.

Empezar a utilizar IronBarcode

Comience a usar IronBarcode en su proyecto hoy con una prueba gratuita.

Primer Paso:
green arrow pointer


Utilice filtros de imagen para mejorar el ejemplo de lectura

Para aplicar el filtro, instancie la clase ImageFilterCollection y cree instancias de cada filtro individualmente. A continuación, asigne el objeto a la propiedad ImageFilters del objeto BarcodeReaderOptions. pase el objeto de opciones al método Read junto con la imagen de muestra.

Utilicemos la siguiente imagen como ejemplo.

Imagen de muestra

A primera vista, la imagen parece bastante borrosa. Sin embargo, el brillo es aceptable y los colores blanco y negro son distinguibles. Por lo tanto, necesitamos aplicar al menos el SharpenFilter y el ContrastFilter para mejorar la legibilidad del código de barras. Consulte el siguiente fragmento de código para aplicar los filtros a la imagen, leerla y mostrarla en la consola.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-apply-filter.cs
using IronBarCode;
using System;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection()
    {
        new SharpenFilter(3.5f),
        new ContrastFilter(2)
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Write the result value to console
foreach (BarcodeResult result in results)
{
    Console.WriteLine(result.Text);
}
Imports IronBarCode
Imports System

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection() From {
		New SharpenFilter(3.5F),
		New ContrastFilter(2)
	}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Write the result value to console
For Each result As BarcodeResult In results
	Console.WriteLine(result.Text)
Next result
$vbLabelText   $csharpLabel

En el fragmento de código anterior, además de aplicar filtros y leer el código de barras, también exportamos la imagen filtrada al disco. La comparación entre la muestra y las imágenes filtradas puede verse a continuación.

Sample image
Muestra filtrada

Explorar los filtros de corrección de imagen

IronBarcode ofrece múltiples filtros de imagen específicamente diseñados para la corrección de imágenes. Estos filtros pueden ayudar a leer imágenes de códigos de barras imperfectas y mejorar la precisión de la lectura. Sin embargo, los usuarios tendrán que entender cómo funcionan estos filtros para

selecciona el filtro adecuado y evita problemas de rendimiento debido al uso excesivo de filtros o al uso del filtro incorrecto. A continuación se muestran todos los filtros disponibles:

  • AdaptiveThresholdFilter
  • BinaryThresholdFilter
  • BrightnessFilter
  • Filtro de contraste
  • Filtro inversor
  • SharpenFilter
  • Filtros de desenfoque

    • FiltroDesenfoqueGaussiano

    • BilateralFilter

    • MedianBlurFilter

    El orden en el que se aplican estos filtros se basa en su colocación dentro de la ImageFilterCollection.

Filtro de umbral adaptativo

AdaptiveThresholdFilter es uno de los filtros disponibles en IronBarcode que aplica la técnica Bradley Adaptive Threshold a la imagen, lo que determina automáticamente el umbral para binarizar una imagen. Este filtro es ideal para imágenes con iluminación no uniforme y niveles de intensidad de fondo variables.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-adaptive-threshold.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new AdaptiveThresholdFilter(0.9f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("adaptiveThreshold_0.9.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New AdaptiveThresholdFilter(0.9F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("adaptiveThreshold_0.9.png")
$vbLabelText   $csharpLabel

A continuación se muestran los resultados de aplicar el filtro utilizando diferentes valores.

Default Adaptive Threshold
0,9 Umbral adaptativo

El constructor también acepta parámetros adicionales para la configuración:

  • Upper: Color superior (blanco) para umbralización.
  • Más bajo: Color más bajo (negro) para umbralización.
  • Umbral: Límite de umbral (0.0-1.0) a considerar para la binarización.
  • Rectángulo: Región rectangular sobre la que aplicar el procesador.

    Como se ve en la imagen de salida arriba, la imagen está binarizada para tener solo colores negro y blanco. Aunque todavía no parece ser ideal para la lectura de códigos de barras, ya que es necesario utilizar filtros combinados. Los usuarios tendrán que experimentar con la sensibilidad de los parámetros para obtener los mejores resultados.

Filtro de umbral binario

El BinaryThresholdFilter filtra una imagen dividiendo los píxeles en el umbral dado, donde se utiliza para comparar la luminancia de un componente de color. Al igual que el AdaptiveThresholdFilter, este filtro puede introducir ruido nuevo o no deseado si no se utiliza correctamente. Sin embargo, IronBarcode ha establecido valores por defecto para las propiedades del filtro.

De forma similar al AdaptiveThresholdFilter, el BinaryThresholdFilter acepta los mismos parámetros adicionales para su configuración.

  • Upper: Color superior (blanco) para umbralización.
  • Más bajo: Color más bajo (negro) para umbralización.
  • Umbral: Límite de umbral (0.0-1.0) a considerar para la binarización.
  • Rectángulo: Región rectangular sobre la que aplicar el procesador.
:path=/static-assets/barcode/content-code-examples/how-to/image-correction-binary-threshold.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new BinaryThresholdFilter(0.9f)
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("binaryThreshold_0.9.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New BinaryThresholdFilter(0.9F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("binaryThreshold_0.9.png")
$vbLabelText   $csharpLabel

A continuación se muestra el resultado de la aplicación de filtros a la imagen de muestra.

Default Binary Threshold
0,9 Umbral binario

Observando la imagen de salida anterior, podemos ver que la muestra ha sido binarizada en color blanco y negro. Sin embargo, puede verse que este filtro no es adecuado para esta imagen, ya que se han eliminado las barras del código de barras y se ha introducido ruido nuevo.

Filtro de luminosidad

BrightnessFilter es otro filtro esencial en la colección de filtros de imagen en IronBarcode. Como su nombre indica, este filtro ajusta el brillo de la imagen del código de barras. La entrada de este constructor puede variar la Cantidad de brillo en la imagen de salida. El valor por defecto es 1, que deja la imagen sin cambios. Un valor de 0 creará una imagen completamente negra, mientras que valores superiores a 1 harán que la imagen sea más brillante.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-brightness.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new BrightnessFilter(1.5f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("brightness_1.5.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New BrightnessFilter(1.5F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("brightness_1.5.png")
$vbLabelText   $csharpLabel

A continuación se muestra la imagen de salida después de aplicar este filtro a la entrada de muestra.

Default Brightness
1,5 Brillo

Filtro de contraste

El ContrastFilter se utiliza para ajustar el nivel de contraste en una imagen. El contraste de imagen se refiere a la diferencia de intensidad de color entre varios elementos de una imagen. Aumentar el nivel de contraste mejora la visibilidad de los detalles, haciendo que la imagen aparezca vívida y llamativa, mientras que reducir el contraste hace que la imagen aparezca más suave y tenue.

El valor por defecto es 1, que deja la imagen sin cambios. Un valor de 0 creará una imagen completamente gris, mientras que valores superiores a 1 aumentarán el contraste de la imagen.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-contrast.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new ContrastFilter(1.5f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("contrast_1.5.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New ContrastFilter(1.5F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("contrast_1.5.png")
$vbLabelText   $csharpLabel

La aplicación de este filtro a la entrada de muestra producirá la imagen siguiente.

Default Contrast
Contraste

Invertir filtro

Este filtro se utiliza para invertir los colores dentro de una imagen, haciendo que los colores opuestos, como el blanco se convierta en negro y el negro en blanco. Es especialmente útil cuando los usuarios intentan leer una imagen de código de barras con un color de fondo. A diferencia del BinaryThresholdFilter, este filtro invierte los colores directamente sin necesidad de especificar sensibilidad. Además, este filtro se puede usar con un CropRectangle para especificar la ubicación en la imagen que necesita que se inviertan los colores, en lugar de invertir los colores de toda la imagen.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-invert.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new InvertFilter(),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("invert.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New InvertFilter()}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("invert.png")
$vbLabelText   $csharpLabel

La imagen de salida que se muestra a continuación es el resultado de aplicar este filtro a la imagen de entrada de muestra.

Original image
Invertido

Filtro Sharpen

El último filtro de corrección de imagen en IronBarcode es el SharpenFilter. Este filtro mejora la nitidez de una imagen y es muy útil para utilizarlo con imágenes borrosas. Los usuarios pueden manipular este filtro para ajustar la nitidez de una imagen ajustando el valor de Sigma al instanciar el objeto del filtro. El valor por defecto es 3. Aumente los valores sigma para aumentar la nitidez de la imagen.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-sharpen.cs
using IronBarCode;
using System;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new SharpenFilter(0.5f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("sharpen_0.5.png");
Imports IronBarCode
Imports System

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New SharpenFilter(0.5F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("sharpen_0.5.png")
$vbLabelText   $csharpLabel

La imagen a continuación es la versión improveda de la imagen de muestra de entrada.

Default Sharpen
Sharpen

Comparando la imagen de arriba con la imagen original, parece más nítida y definitivamente ayudaría en la lectura de códigos de barras usando IronBarcode. En la mayoría de los casos, SharpenFilter se aplica siempre junto con otros filtros en la clase ImageFilterCollection.

Filtros de desenfoque

Filtros GaussianBlur

El GaussianBlurFilter se utiliza para aplicar un desenfoque gaussiano a una imagen. Este filtro se utiliza comúnmente para reducir el ruido en una imagen.

El filtro funciona promediando los valores de los píxeles vecinos en la imagen utilizando una función gaussiana. El método se basa en dos factores ajustables:

  • Núcleo: una matriz utilizada para promediar los píxeles.
  • Sigma: un valor que controla la intensidad del desenfoque.

    El tamaño del kernel predeterminado es de 3x3 píxeles, y el valor Sigma predeterminado es 3.0, lo que produce un desenfoque moderado. Aumentar el valor de Sigma resultará en un efecto de desenfoque más fuerte. También puedes personalizar el núcleo para controlar el tamaño del vecindario que promedia el filtro de desenfoque.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-gaussianblur.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new GaussianBlurFilter(3, 3, 3.0f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sharpen.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("gaussianBlur.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New GaussianBlurFilter(3, 3, 3.0F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sharpen.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("gaussianBlur.png")
$vbLabelText   $csharpLabel

La aplicación de este filtro a la entrada de muestra producirá la imagen siguiente.

Default Sharpen
Imagen de desenfoque gaussiano

Filtros bilaterales

El BilateralFilter se utiliza para suavizar imágenes mientras se preservan los bordes. A diferencia de las técnicas de desenfoque simples, que afectan a todos los píxeles de manera uniforme, el Filtro Bilateral considera tanto las diferencias de color como la distancia entre píxeles, lo que lo hace efectivo para un alisado que preserva los bordes.

El método se basa en tres factores ajustables:

  • NeighborhoodDiameter: Especifica el diámetro del vecindario de píxeles utilizado para el filtrado. Un diámetro mayor incluye más píxeles circundantes en el filtro. El valor predeterminado es 5.
  • SigmaColor: Esto representa la influencia del color. Determina cuánto afecta la diferencia de color entre píxeles vecinos al filtrado. Un valor más alto significa que los píxeles con diferentes colores se influenciarán más entre sí. El valor predeterminado es 75.0.
  • SigmaSpace: Esto representa la influencia espacial. Determina cuánto afecta la distancia entre píxeles al filtrado. Un valor más alto significa que los píxeles que están más distantes se influenciarán más entre sí. El valor predeterminado es 75.0.
:path=/static-assets/barcode/content-code-examples/how-to/image-correction-bilateral.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new BilateralFilter(5, 75, 75),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sharpen.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("bilateral.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New BilateralFilter(5, 75, 75)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sharpen.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("bilateral.png")
$vbLabelText   $csharpLabel

La aplicación de este filtro a la entrada de muestra producirá la imagen siguiente.

Default Sharpen
Imagen bilateral

Filtros MedianBlur

El filtro MedianBlurFilter es un filtro utilizado para reducir el ruido en una imagen reemplazando el valor de cada píxel con el valor mediano de los píxeles circundantes. Este filtro es particularmente efectivo para preservar los bordes mientras elimina el ruido.

  • KernelSize: Define el tamaño del vecindario alrededor de cada píxel utilizado para calcular la mediana. El valor debe ser un número impar mayor que 0. El valor predeterminado es 5.
:path=/static-assets/barcode/content-code-examples/how-to/image-correction-medianblur.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new MedianBlurFilter(5),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sharpen.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("medianBlur.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New MedianBlurFilter(5)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sharpen.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("medianBlur.png")
$vbLabelText   $csharpLabel

La aplicación de este filtro a la entrada de muestra producirá la imagen siguiente.

Default Sharpen
Imagen DesenfoqueMediano

Guardar iteraciones

Cuando aplicas múltiples filtros al código de barras, puede ser difícil ver el resultado después de cada método de filtrado. Esta función permite guardar la imagen filtrada después de aplicar cada filtro, en el orden en que se procesan. Para habilitar esta función, primero pasa true al constructor de ImageFilterCollection. A continuación, usa el método ExportFilterImagesToDisk para proporcionar la ruta y el nombre de las imágenes de salida.

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-save-iterations.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new SharpenFilter(3.5f),
        new AdaptiveThresholdFilter(0.5f),
        new ContrastFilter(2)
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("filteredImage.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {
		New SharpenFilter(3.5F),
		New AdaptiveThresholdFilter(0.5F),
		New ContrastFilter(2)
	}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("filteredImage.png")
$vbLabelText   $csharpLabel

Los filtros se aplican en el orden del código y las imágenes de salida reflejan los resultados de cada iteración.

  • Afilado -> Después de Afilado
  • Afilado + Umbral Adaptativo -> Después del Umbral Adaptativo
  • Afilado + Umbral Adaptativo + Contraste -> Después del Contraste
    Sample image
    Contraste
    Sample image
    Contraste

    Aparte de las propiedades de ImageFilters, los usuarios también pueden agregar otras propiedades en BarcodeReaderOptions para una lectura más precisa, consulte este artículo para más información.

Hairil Hasyimi Bin Omar
Ingeniero de software
Como todos los grandes ingenieros, Hairil es un ávido aprendiz. Está perfeccionando sus conocimientos de C#, Python y Java, y los utiliza para añadir valor a los miembros del equipo de Iron Software. Hairil se unió al equipo de Iron Software desde la Universiti Teknologi MARA de Malasia, donde se licenció en Ingeniería Química y de Procesos.