Как я могу разделить две области матрицы?

На картинке ниже представлена матрица, на которой мне нужно выделить контур между двумя областями (между сплошной красной и прореженной).

Я делаю так: использую скользящее среднее, чтобы области стали сплошными, а затем разделяю две области по пороговому значению, за которое я принимаю среднее значение матрицы. Это даёт приблизительный результат, но во многих случаях получается криво.

Скользящее среднее оставляет такой эффект: значения как-бы "сдвигаются" на определенную величину, и это явно заметно при попытке выделить контур.

Как я могу сделать выделение контура более точным? матрица

Вот мой код скользящего среднего:

def mov_a(mat, size):
    k = mat.shape[0] - size + 1
    res = np.zeros((k, k))
    for i in range(k):
        for j in range(k):
            res[i, j] = np.mean(mat[i:i+size, j:j+size])
    return res

А вот код, который я использую для разделения точек (за 1 берется область, где больше нулей):

circuit = np.zeros((175, 175))
av = np.mean(m)
for i in range(m.shape[0]):
    for j in range(m.shape[1]):
        if(m[i, j] < av):
            circuit[i, j] = 1

Ответы (1 шт):

Автор решения: strawdog

Ваша задача нетривиальна только за счет наличия шума - для избавления придется подбирать пороги эмпирически. но решить можно попробовать так:

from skimage import measure
import cv2
import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
im = cv2.imread("matrix.png")
dst = cv2.fastNlMeansDenoisingColored(im,None,50,50,17,31) # <- здесь
imgray = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)
contours = measure.find_contours(imgray)

ax.imshow(dst)
for contour in contours:
    ax.plot(contour[:, 1], contour[:, 0], linewidth=2)
plt.show()

введите сюда описание изображения

И еще: если вас просят предоставить пример исходных данных, не ленитесь, предоставляйте.

→ Ссылка