Đếm số lượng của một số trong khu vực hình ảnh


8

Mục tiêu của bạn là viết một chương trình hoặc hàm đầy đủ có 5 số nguyên dương và một chuỗi có tên tệp hình ảnh làm đầu vào [X1,Y1], [X2,Y2], N, image.jpgở bất kỳ định dạng hợp lý nào, trong đó:

  • Cặp đôi đầu tiên [X1,Y1]là trên cùng bên trái X, Ytọa độ ( <=20) của khu vực hình chữ nhật màu xanh trong hình ảnh ví dụ ( 16,11).
  • Cặp thứ hai [X2,Y2]là phía dưới bên phải X, Ytọa độ ( <=20) của khu vực hình chữ nhật màu xanh trong hình ảnh ví dụ ( 20,22).
  • Số thứ năm Nnhư 0 <= N <= 9là số mà đã được tìm thấy.
  • Tham số thứ sáu là một chuỗi có tên tệp của ảnh JPG này .

Xuất ra có bao nhiêu trong số Nđó hiện diện trong khu vực được chỉ định (được phác thảo bằng màu xanh lam trong hình cho ví dụ này):

nhập mô tả hình ảnh ở đây

Nhấn vào đây để có được một phiên bản sạch lớn hơn của cùng một hình ảnh.

Trong hình có 500 số từ 0đến 9(bao gồm) được sắp xếp thành 20 cột trên 25 hàng, theo phông Courier Newchữ đơn cách . Mỗi số khác nhau có một màu khác nhau (bạn có thể tận dụng thực tế này hoặc bỏ qua nó và xem xét hoặc chuyển đổi hình ảnh ở dạng đơn sắc nếu điều đó giúp bạn).

Các trường hợp thử nghiệm:

[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)

Quy tắc:

  • Đây là nên mã ngắn nhất sẽ thắng.
  • Bạn phải lấy làm đầu vào tệp JPG này .
  • Bạn không được phép mã hóa ma trận các số được biểu thị trong JPG hoặc kết quả.
  • Sơ hở tiêu chuẩn bị cấm.

Câu trả lời:


4

Toán học, 92 byte

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

Hàm không tên lấy các đối số theo định dạng này : [{X1,X2}, {Y1,Y2}, N, "image.jpg"]. (Thật vậy, đối số thứ tư có thể là tên tệp cục bộ hoặc URL http://i67.tinypic.com/6qh5lj.jpg.)

Import@#4nhập tệp hình ảnh, Binarize[...,.9]làm tối tất cả các số thành màu đen và TextRecognize(chức năng rõ ràng thực hiện việc nâng vật nặng ở đây!) trích xuất một chuỗi nhiều dòng từ hình ảnh kết quả, được chia thành một danh sách các ký tự lồng nhau Characters@.

Take[...,#2,#]chỉ giữ các ký tự tương ứng với hình chữ nhật được phác thảo và Count[...,ToString@#3,2]đếm số lần xuất hiện Ntrong kết quả.


2

Python 3 + gối + pytesseract, 239 byte

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)])

Điều này là không hiệu quả khủng khiếp vì đối với mỗi ô số, toàn bộ tệp được phân tích cú pháp. Giải pháp 243 byte nhanh hơn và dài hơn một chút sẽ là

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)])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.