We can remove them using findContours to get the boxes.
We need to make a mask of the image first. I'm using the [200, 255] range to get the white background. I then eroded the mask to make sure that the boxes have enough separation from one another.

Then I used findContours to get the boxes. I removed small contours to filter out the numbers inside the boxes. I redrew the boxes without the numbers inside of them.

I then went back over the original image and whited-out the masked areas.

import cv2
import numpy as np
# load image
img = cv2.imread("numbers.png");
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
mask = cv2.inRange(gray, 200, 255);
# erode to enhance box separation
kernel = np.ones((3,3), np.uint8);
mask = cv2.erode(mask, kernel, iterations = 1);
# contours OpenCV3.4, if you're using OpenCV 2 or 4, it returns (contours, _)
_, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE);
# only take big boxes
cutoff = 250;
big_cons = [];
for con in contours:
area = cv2.contourArea(con)
if area > cutoff:
big_cons.append(con);
print(area);
# make a mask
redraw = np.zeros_like(mask);
cv2.drawContours(redraw, big_cons, -1, (255), -1);
redraw = cv2.bitwise_not(redraw);
img[redraw == 255] = (255,255,255); # replace with whatever color you want as your background
# show
cv2.imshow("Image", img);
cv2.imshow("Mask", mask);
cv2.imshow("redraw", redraw);
cv2.waitKey(0);