1. Proceso de identificación
Flujo de trabajo de identificación de recibos
Trabajar con imágenes en MATLAB
Importe, muestre y manipule imágenes en color y escala de grises.
Segmentar una imagen
Cree imágenes binarias mediante el umbral de los valores de intensidad de píxeles.
Técnicas de preprocesamiento y posprocesamiento
Mejore la segmentación de una imagen utilizando técnicas comunes de procesamiento previo y posterior.
Clasificación y procesamiento por lotes
Desarrolle una métrica para clasificar una imagen y aplique esa métrica a un conjunto de archivos de imagen.
二 、 Trabajar con imágenes en MATLAB
1.Obtener imágenes en MATLAB
Importación de imágenes a MATLAB
En todos los flujos de trabajo de procesamiento de imágenes de MATLAB, el primer paso es importar imágenes al espacio de trabajo de MATLAB.
Una vez allí, puede utilizar las funciones de MATLAB para mostrar, procesar y clasificar las imágenes.
Puede importar una imagen a la memoria y asignarla a una variable en el espacio de trabajo de MATLAB para su posterior manipulación, visualización y exportación.
A = imread ("imgFile.jpg");
Terminar la línea con un punto y coma evita que MATLAB muestre los valores almacenados A
, lo cual es útil ya que las imágenes generalmente contienen millones de valores.
I = imread("IMG_001.jpg");
En esta capacitación, trabajará con una combinación de imágenes de recibo y no recibo. Los nombres de los archivos no indican si una imagen es una imagen de recibo o no, pero puede averiguarlo mostrando la imagen.
Los datos de imagen almacenados en una variable A
se pueden mostrar usando la imshow
función.
imshow(A)
imshow(I)
I2 = imread("IMG_002.jpg");
imshow(I2)
A menudo, desea ver varias imágenes. Por ejemplo, es posible que desee comparar una imagen y una versión modificada de esa imagen.
Puede mostrar dos imágenes juntas usando la imshowpair
función.
imshowpair (A1, A2, "montaje")
La "montage"
opción coloca las imágenes A1
y una al A2
lado de la otra, A1
a la izquierda y A2
a la derecha.
imshowpair(I,I2,"montage")
Cuando haya terminado de procesar una imagen en MATLAB, puede guardarla en un archivo. La función imwrite exporta datos almacenados en el espacio de trabajo de MATLAB a un archivo de imagen.
imwrite (imgData, "img.jpg")
El formato del archivo de salida se identifica automáticamente según la extensión del archivo.
Intente utilizar imwrite
para exportar I
como un archivo PNG. Luego use imread
para cargar el archivo de imagen en una nueva variable y mostrarlo.
imwrite (yo, "myImage.png")
Inew = imread ("myImage.png");
imshow (nuevo)
Recuerde que puede ejecutar su secuencia de comandos haciendo clic en el botón Ejecutar o Ejecutar sección en la barra de herramientas de MATLAB.
Cuando haya terminado de practicar, puede pasar a la siguiente sección.
2.Imágenes en escala de grises y en color
Imágenes de color planes in ticket
Si bien los recibos contienen principalmente colores en escala de grises, las imágenes de recibos aún se almacenan con tres planos de color como otras imágenes en color. Como la luz del sol, que se compone de un espectro completo de colores, los planos de color se combinan para crear un papel blanco brillante.
Extraer planos de color y valores de intensidad
Muchas técnicas de procesamiento de imágenes se ven afectadas por el tamaño de la imagen. Todas las imágenes que clasificarás tienen el mismo tamaño: 600 píxeles de alto y 400 píxeles de ancho.
Puedes encontrar el tamaño de una matriz usando la size
función.
sz = tamaño (A)
El primer valor devuelto por size
es el número de filas en la matriz, que corresponde a la altura de la imagen. El segundo valor es el número de columnas en la matriz, que corresponde al ancho de la imagen.
I = imread("IMG_003.jpg");
imshow(I)
sz = size(I)
¿El tamaño de la matriz coincide con el tamaño de la imagen en píxeles? Casi. Usted probablemente ha notado que había un valor adicional devuelto por la size
función: 3
.
Esto se debe a que la imagen importada es una imagen en color, por lo que necesita una tercera dimensión para almacenar los planos de color rojo, verde y azul.
Puede acceder a los planos de color individuales de una imagen indexando en la tercera dimensión. Por ejemplo, puede extraer el plano de color verde (segundo) utilizando el valor 2
como tercer índice.
Ig = I(:,:,2);
R = I(:,:,1);
imshow(R)
La mayoría de las imágenes utilizan el uint8
tipo de datos entero de 8 bits sin signo ( ), que almacena números enteros de 0 a 255. Las imágenes brillantes o de colores brillantes contienen valores de intensidad de píxeles cercanos a 255 en uno o más planos de color.
El plano rojo de esta imagen de recibo tiene algunas áreas bastante brillantes. ¿Crees que alcanzará el valor máximo de 255?
Puede encontrar el valor más grande en una matriz usando la max
función.
Amax = max (A, [], "all") El
uso de la "all"
opción encuentra el máximo en todos los valores de la matriz. Los corchetes son obligatorios; son marcadores de posición para una entrada no utilizada.
Rmax = max(R,[],"all")
Las áreas oscuras, como el texto del recibo, contienen valores cercanos a cero. Según la imagen del plano rojo de la Tarea 3, ¿crees que el plano rojo tiene elementos con un valor de 0?
Puede encontrar el valor más pequeño en una matriz usando la min
función.
Amin = min(A,[],"all")
Rmin = min(R,[],"all")
Muchas tareas comunes se pueden completar más rápidamente utilizando las funciones de Image Processing Toolbox. Por ejemplo, si desea extraer los tres planos de color de una matriz de imágenes, puede utilizarlos en imsplit
lugar de indexarlos en cada plano individualmente.
[R, G, B] = dividir (A);
Puede mostrar los tres planos de color a la vez usando montage
.
montaje ({R, G, B})
Intente usar imsplit
para extraer los planos de color de I
. Visualice los tres planos de color usando montage
.
Convertir de color a escala de grises
¿Por qué convertir a escala de grises?
- Cuando se carga en la memoria, una imagen en escala de grises ocupa un tercio del espacio requerido para una imagen RGB.
- Debido a que una imagen en escala de grises tiene un tercio de los datos, requiere menos poder de cálculo para procesar y puede reducir el tiempo de cálculo.
- Una imagen en escala de grises es conceptualmente más simple que una imagen RGB, por lo que desarrollar un algoritmo de procesamiento de imágenes puede ser más sencillo cuando se trabaja con escala de grises.
En las imágenes de recibos, como la que se muestra a continuación, se pierde poca información al convertir a escala de grises. Se conservan las características esenciales, como el texto oscuro y el papel brillante.
Por otro lado, si quisiera clasificar el producto visible en el fondo, los planos de color serían esenciales. Después de convertir a escala de grises, es difícil ver el brócoli, y mucho menos clasificarlo.
El algoritmo que implementará en esta capacitación se basa en la identificación de texto, por lo que el color no es necesario. La conversión de las imágenes a escala de grises elimina el color y ayuda al algoritmo a enfocarse en los patrones en blanco y negro que se encuentran en los recibos.
Puede convertir una imagen a escala de grises usando la im2gray
función.
Ags = im2gray(A);
I = imread("IMG_002.jpg");
imshow(I)
gs = im2gray(I);
imshow(gs)
¿Notó que el color púrpura del texto del recibo se pierde durante la conversión a escala de grises? Sin embargo, dado que no todos los recibos tienen texto violeta, los valores violetas no son útiles en un algoritmo de clasificación.
Esta insignificante pérdida de información tiene una ventaja: gs
es un tercio del tamaño de I
, teniendo solo dos dimensiones en lugar de tres. Puede verificar esto con la size
función.
sz = size(gs)
La imagen en escala de grises creada por im2gray
es un solo plano de valores de intensidad. Los valores de intensidad se calculan como una suma ponderada de los planos RGB, como se describe aquí.
Si más adelante necesitará sus imágenes en escala de grises convertidas, puede guardarlas en un archivo. Intente usar imwrite
para guardar gs
en el archivo gs.jpg
.
3.Ajuste de contraste
Histogramas de contraste e intensidad
Aunque estas dos imágenes de recibos son en escala de grises, el contraste es diferente.
Si está analizando un conjunto de imágenes, normalizar el brillo puede ser un paso de preprocesamiento importante, especialmente para identificar los patrones de texto en blanco y negro en las imágenes de recibos.
Un histograma de intensidad separa los píxeles en contenedores en función de sus valores de intensidad. Las imágenes oscuras, por ejemplo, tienen muchos píxeles agrupados en el extremo inferior del histograma. Las regiones brillantes tienen píxeles agrupados en el extremo superior del histograma.
El histograma a menudo sugiere dónde se pueden realizar ajustes simples para mejorar la definición de las características de la imagen. ¿Observa algún ajuste que podría hacerse en la imagen del recibo para que el texto sea más fácil de identificar?
Una de las características de identificación esenciales de una imagen de recibo es el texto. Las imágenes de los recibos deben tener un buen contraste para que el texto se destaque del fondo del papel.
Puede investigar el contraste en una imagen viendo su histograma de intensidad usando la imhist
función.
imista (yo)
Si el histograma muestra píxeles agrupados principalmente en los extremos alto y bajo del espectro, el recibo tiene un buen contraste. De lo contrario, probablemente podría beneficiarse de un ajuste de contraste.
I = imread("IMG_001.jpg");
I2 = imread("IMG_002.jpg");
gs = im2gray(I);
gs2 = im2gray(I2);
imshowpair(gs,gs2,"montage")
imhist(gs)
¿El histograma gs
sugiere un alto contraste entre el texto y el papel del recibo, o cree que podría necesitar un ajuste?
Se gs2
muestra una segunda imagen, en el guión. ¿Parece descolorido? Si bien una inspección visual puede ser útil, a menudo es más fácil evaluar el contraste al ver el histograma.
imhist(gs2)
El histograma de intensidad de gs2
muestra un menor contraste entre el texto y el fondo. La mayoría de los píxeles oscuros tienen valores de intensidad alrededor de 100, y no muchos píxeles brillantes tienen valores de intensidad superiores a 200. Eso significa que el contraste es aproximadamente la mitad de lo que podría ser si la imagen usara el rango de intensidad completo (0 a 255).
El aumento del contraste de la imagen ilumina los píxeles claros y aumenta los píxeles oscuros. Puede utilizar la imadjust
función para ajustar el contraste de una imagen en escala de grises automáticamente.
Aadj = imadjust (A);
gs2Adj = imadjust(gs2);
imshowpair(gs2,gs2Adj,"montage")