Python эквивалент «bwarea» от MATLAB - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь определить уровень неравномерности по периметру белого объекта на черном изображении. Я нашел хороший код для этого в MATLAB, но он опирается на функцию bwarea, которая кажется взвешенной областью, которая учитывает периметр. Я не уверен, что эквивалентный код будет в python - был бы очень признателен, если бы кто-то мог дать мне эквивалент. В качестве альтернативы, если кто-то знает хороший показатель c для определения нерегулярности периметра белого объекта на черном изображении (т.е. двоичном изображении), это также было бы полезно !!

1 Ответ

0 голосов
/ 04 мая 2020

Спасибо за указатель на документацию! Я включил мою реализацию ниже. Я сомневаюсь, что это очень эффективно, но для меня это сработало достаточно:

def patternScore(neighborhood):
    m_sum = 0
    m_sum = neighborhood[0,0] + neighborhood[0,1] + neighborhood[1,0] + neighborhood[1,1]
    if(m_sum == 3):
        return float(7.0/8.0)
    elif(m_sum == 0):
        return 0
    elif(m_sum == 1):
        return float(1.0/4.0)
    elif(m_sum == 4):
        return 1
    else:
        if(neighborhood[0][1] == neighborhood[0][0]):
            return .5
        elif(neighborhood[1][0] == neighborhood[0][0]):
            return .5
        else:
            return .75

def neighbors(im, i, j, d=1):
    im = np.array(im).astype(int)
    top_left = im[i-d:i+d, j-d:j+d]
    top_right = im[i-d:i+d, j:j+d+1]
    bottom_left = im[i:i+d+1, j-d:j+d]
    bottom_right = im[i:i+d+1, j:j+d+1]
    pattern = (patternScore(top_left) + patternScore(top_right) + patternScore(bottom_left) + patternScore(bottom_right))
    return pattern

def bwarea(img):
    d = 1
    area = 0
    for i in range(1,img.shape[0]-1):
        for j in range(1,img.shape[1]-1):
            area += neighbors(img,i,j)
    return area
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...