Python 3, 144 127 bytes
This solution uses cv2
's awesome image processing power. Despite cv's less awesome, super long and readable method names, it beats both other Python answers!
Golfed:
import cv2,numpy as n
f=lambda b:n.amax(cv2.connectedComponents(b*255,0,4)[1])
def g(a):b=n.array(a,n.uint8);print(f(1-b),f(b))
Expanded:
import cv2
import numpy as np
# Finds the number of connected 1 regions
def get_components(binary_map):
_, labels = cv2.connectedComponents(binary_map*255, connectivity=4) # default connectivity is 8
# labels is a 2d array of the binary map but with 0, 1, 2, etc. marking the connected regions
components = np.amax(labels)
return components
# Takes a 2d array of 0s and 1s and returns the number of connected regions
def solve(array):
binary_map = np.array(input_map, dtype=np.uint8)
black_regions = get_components(1 - binary_map) # 0s
white_regions = get_components(binary_map) # 1s
return (black_regions, white_regions)