← All solutions
September 13Medium

Image overlap

  • Array
  • Matrix

Problem

You are given two images, img1 and img2, represented as binary, square matrices of size n x n. A binary matrix has only 0s and 1s as values.

We translate one image however we choose by sliding all the 1 bits left, right, up, and/or down any number of units. We then place it on top of the other image. We can then calculate the overlap by counting the number of positions that have a 1 in both images.

Note also that a translation does not include any kind of rotation. Any 1 bits that are translated outside of the matrix borders are erased.

Return the largest possible overlap.

Solution

class Solution:
    def largestOverlap(self, img1: List[List[int]], img2: List[List[int]]) -> int:
        m, n = len(img1), len(img1[0])

        ans = 0
        for dx in range(-m+1, m):
            for dy in range(-n+1, n):
                local_ans = 0
                x_start, x_end = (0, m - dx) if dx >= 0 else (abs(dx), m)
                y_start, y_end = (0, n - dy) if dy >= 0 else (abs(dy), n)

                for x in range(x_start, x_end):
                    for y in range(y_start, y_end):
                        if img1[x][y] == img2[x + dx][y + dy] == 1:
                            local_ans += 1
                ans = max(ans, local_ans)

        return ans