Cuente el número de un número en el área de la imagen

8

Su objetivo es escribir un programa o función completa que tome 5 enteros positivos y una cadena con un nombre de archivo de imagen como entrada [X1,Y1], [X2,Y2], N, image.jpgen cualquier formato razonable, donde:

  • Primera pareja [X1,Y1]son la parte superior izquierda X, Ylas coordenadas ( <=20) de la zona rectángulo azul en la imagen de ejemplo ( 16,11).
  • En segundo par [X2,Y2]son la parte inferior derecha X, Ycoordenadas ( <=20) de la zona rectángulo azul en la imagen de ejemplo ( 20,22).
  • Quinto número Ntal 0 <= N <= 9es el número que se debe encontrar.
  • El sexto parámetro es una cadena con el nombre de archivo de esta imagen JPG .

Indique cuántos de ellos Nestán presentes en el área indicada (delineada en azul en la imagen para este ejemplo):

ingrese la descripción de la imagen aquí

Haga clic aquí para obtener una versión limpia más grande de la misma imagen.

En la imagen hay 500 números de 0a 9(incluido) dispuestos en 20 columnns por 25 filas, en monospaced Courier Newfuente. Cada número diferente tiene un color diferente (puede aprovechar este hecho o ignorarlo y considerar o convertir la imagen en monocromo si eso lo ayuda).

Casos de prueba:

[4,4],[13,5],1,image.jpg    > 4  (outlined in red)
[4,4],[13,5],4,image.jpg    > 2  (outlined in red)
[17,5],[17,5],2,image.jpg   > 1  (outlined in magenta)
[17,5],[17,5],9,image.jpg   > 0  (outlined in magenta)
[20,8],[20,9],3,image.jpg   > 1  (outlined in cyan)
[20,8],[20,9],2,image.jpg   > 0  (outlined in cyan)
[16,11],[20,22],0,image.jpg > 8  (outlined in blue)
[16,11],[20,22],3,image.jpg > 9  (outlined in blue)
[3,14],[11,20],7,image.jpg  > 6  (outlined in green)
[3,14],[11,20],5,image.jpg  > 6  (outlined in green)
[3,14],[11,20],8,image.jpg  > 8  (outlined in green)
[1,1],[20,25],0,image.jpg   > 47 (whole picture)
[1,1],[20,25],8,image.jpg   > 50 (whole picture)
[1,1],[20,25],1,image.jpg   > 55 (whole picture)

Reglas:

  • Este es el por lo que gana el código más corto.
  • Debe tomar como entrada este archivo JPG .
  • No está permitido codificar la matriz de números representada en el JPG o los resultados.
  • Las lagunas estándar están prohibidas.
Mario
fuente

Respuestas:

4

Mathematica, 92 bytes

Count[Take[Characters@StringSplit@TextRecognize@Binarize[Import@#4,.9],#2,#],ToString@#3,2]&

Función sin nombre tomando los argumentos en este formato: [{X1,X2}, {Y1,Y2}, N, "image.jpg"]. (De hecho, el cuarto argumento puede ser el nombre del archivo local o la URL http://i67.tinypic.com/6qh5lj.jpg).

Import@#4importa el archivo de imagen, Binarize[...,.9]oscurece todos los números a negro y TextRecognize(la función que claramente hace el trabajo pesado aquí) extrae una cadena de varias líneas de la imagen resultante, que se divide en una lista anidada de caracteres con Characters@.

Take[...,#2,#]mantiene solo los caracteres correspondientes al rectángulo delineado y Count[...,ToString@#3,2]cuenta el número de ocurrencias del Nresultado.

Greg Martin
fuente
2

Python 3 + almohada + pytesseract, 239 bytes

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split()[i//w+a[1]-1][i%w+a[0]-1]==str(n)])

Esto es terriblemente ineficiente ya que para cada mosaico de números, se analiza todo el archivo. La solución de 243 bytes mucho más rápida y ligeramente más larga sería

from PIL.Image import*
from pytesseract import*
def c(a,b,n,f):s=image_to_string(open(f).convert('L').point(lambda x:[9,0][x<250],'1')).split();w,h=b[0]-a[0]+1,b[1]-a[1]+1;return len([1for i in range(h*w)if s[i//w+a[1]-1][i%w+a[0]-1]==str(n)])
TidB
fuente