Вы можете использовать функцию порогового значения для преобразования изображения в двоичное изображение в темные / светлые пиксели, чтобы темные пиксели были равны 0, а светлые - 1.
Затем вы захотите удалить артефакты изображения, используя функции расширения и эрозии, чтобы удалитьшум (все они хорошо определены в Википедии).
Наконец, если вы знаете, где находятся поля, вы можете просто получить значение в центре каждого блока, чтобы определить значение массива, или, возможно, использовать область рядомцентр и возьмите преобладающее значение (т. е. больше 0 - это заполненный квадрат, больше 1 - это пустой квадрат).
Если вы сканируете эти ящики, и их расположение сильно варьируетсяВам потребуется выполнить некоторый уровень регистрации изображений с использованием известных точек или опорных точек.
Что касается инструментов, которые можно использовать для этого, я бы рекомендовал сначала попробовать это вручную, используя такой инструмент, как ImageJ , который имеет пользовательский интерфейс и может также использоваться программно, поскольку он написан на Java.
Другой хороший библиотекарьЭто включает OpenCV и Java Advanced Imaging API.
Ваши результаты будут определенно отличаться в зависимости от входных изображений и их постоянного освещения и расположения.
Лучший способ узнать, как это будет работать с вашими данными, - это попробовать применить эти этапы обработки вручную, чтобы увидеть, где должно быть ваше пороговое значение, насколько необходимо расширение / размытие, чтобы получить согласованные результаты.