Конечно, это не идеальный ответ. Но это может быть чем-то полезным.
Я воссоздаю изображение следующим образом:
Затем я прочитал его и пошел по твоему пути ссначала сделать его двоичным (с небольшой модификацией, чтобы уменьшить шумы):
import numpy as np
from matplotlib import pyplot as plt
img = plt.imread("sample.jpg")
img2 = img.copy()
img2[img2.sum(-1) > 30] = 255
img2[img2.sum(-1) <= 30] = 0
Вот результат после этой модификации:
ВАРИАНТ 1
Возможно, это не то, что вы просили, но оно похоже на одно из решений, обсуждаемых в комментариях, и я думаю, что это отчасти правильно:
i, j = np.where(img2.sum(-1) > 0) # find all white coordinates
i, j = (i[j.argmax()], j[j.argmax()]) # the corner white point into the black
img2[:i, :j] = 255 # paint whine all the left-above rectangle from this point
Вот окончательный результат:
Это несовершенное, но довольно простое чисто решение для кучи.
ОПЦИЯ 2
В этом решении нам понадобится простое исчисление и линейная алгебра. Возьмите две точки в 2D-пространстве и проведите линию между ними. Итак, какова функция границы?
point2 = (i, j) # same i and j from OPTION1 (coordinates of the top-right corner)
point1 = (img2.shape[0], img2[-1].sum(-1).argmin()) # the bottom-right white corner.
a = (point2[1] - point1[1]) / (point2[0] - point1[0])
c = point1[1] - a * point1[0]
f = lambda x: int(a * x + c)
Теперь нарисуйте все области слева от линии:
for i in range(img2.shape[0]):
img2[:i, :f(i)+1] = 255
Вот результат: