图形相似在模式识别中的应用及python实现

Reference

算法流程图

注意:基本原理方法在文章中有详细介绍

使用该文章的方法,实现一个图形相似度的计算,完成模式识别

import numpy as np


class Cycle(object):
    def __init__(self, N, E, S):
        self.N = N  # 元素数量
        # [['类型', '连接方式', '尺寸约束'], ['类型', '连接方式', '尺寸约束'], ['类型', '连接方式', '尺寸约束']...]
        self.E = E
        self.S = S  # 对称性

    def __str__(self):
        return 'N={}\nE={}\nS={}\n'.format(self.N, self.E, self.S)

    __repr__ = __str__


# 几何元素类型的相似系数
def type_coeff(o1, o2):
    if o1 == o2:
        return 1
    return 0.25


# 几何元素的连接方式的相似系数
def method_coeff(o1, o2):
    if o1 == o2:
        return 1
    if o1 in (0,6) and o2 in (0,6):
        return 0.75
    if o1 in (0,6) and o2 in (1,2,5) or o2 in (0,6) and o1 in (1,2,5):
        return 0.5
    return 0
    # if o1 in [0,1,2,6] and o2 in [3,4] or o2 in [0,1,2,6] and o1 in [3,4]:
    #     return 0
    # return 0


# a = method_coeff(1, 1)
# print(a)

# 几何元素的尺寸约束状况的相似系数
def size_coeff(o1, o2):
    if o1 == o2:
        return 1
    if o1 in (2,3) and o2 in (2,3):
        return 0.75
    return 0
    # if o1 in (2,3) and o2 in (1,4,5) or o2 in (2,3) and o1 in (1,4,5):
    #     return 0


# 对称性的相似系数
def symmtry_coeff(o1, o2):
    if o1 == o2:
        return 1
    return 0


def calculate_Qt(ca, cb):
    N = ca.N
    qt = 0
    for i in range(N):
        o1_type = ca.E[i][0]  # C1元素类型
        o2_type = cb.E[i][0]  #
        o1_state = ca.E[(i+1) % N][0]  # C1连接状态
        o2_state = cb.E[(i+1) % N][0]
        qt += type_coeff(o1_type, o2_type) + type_coeff(o1_state, o2_state)
    # gt /= (2*N)
    return qt/(2*N)


def calculate_Qg(ca, cb):
    N = ca.N
    qg = 0
    for i in range(N):
        o1_type = ca.E[i][0]  # C1元素类型
        o2_type = cb.E[i][0]  #
        o1_state = ca.E[(i + 1) % N][0]  # C1连接状态
        o2_state = cb.E[(i + 1) % N][0]
        o1_method = ca.E[i][1]  # C3连接方式
        o2_method = cb.E[i][1]  #
        qg += type_coeff(o1_type, o2_type) + type_coeff(o1_state, o2_state) + method_coeff(o1_method, o2_method)
    o1_sym = ca.S  # C4对称性
    o2_sym = cb.S
    qg += symmtry_coeff(o1_sym, o2_sym)
    return qg / (3 * N + 1)


def calculate_Qd(ca, cb):
    N = ca.N
    qd = 0
    for i in range(N):
        o1_type = ca.E[i][0]  # C1元素类型
        o2_type = cb.E[i][0]  #
        o1_state = ca.E[(i + 1) % N][0]  # C1连接状态
        o2_state = cb.E[(i + 1) % N][0]
        o1_method = ca.E[i][1]  # C3连接方式
        o2_method = cb.E[i][1]  #
        o1_size = ca.E[i][2]  # C5尺寸约束
        o2_size = cb.E[i][2]
        qd += type_coeff(o1_type, o2_type) + type_coeff(o1_state, o2_state) \
              + method_coeff(o1_method, o2_method) + size_coeff(o1_size, o2_size)
    o1_sym = ca.S  # C4对称性
    o2_sym = cb.S
    qd += symmtry_coeff(o1_sym, o2_sym)
    return qd / (4 * N + 1)


def core(graph, re_graph):
    # -1 代表确定性相似  -2 表示模糊性相似 -3 表示完成不相似
    graph_similar = []
    jude_similar = []
    for i in range(len(graph)):  # 检查图的每一个环
        s = ''
        qt = 0
        qg = 0
        qd = 0
        qt = calculate_Qt(graph[i], re_graph[i])
        if qt == 1:
            qg = calculate_Qg(graph[i], re_graph[i])
            if qg == 1:
                qd = calculate_Qd(graph[i], re_graph[i])
                # t = qd
                if qd == 1:
                    s = '确定性相似'
                elif qd == 0:
                    s = '完全不相似'
                else:
                    s = '模糊性相似'
            elif qg == 0:
                s = '完全不相似'
            else:
                s = '模糊性相似'
        elif qt == 0:
            s = '完全不相似'
        else:
            s = '模糊性相似'
        similar = qt + qg + qd
        graph_similar.append(similar)
        jude_similar.append(s)
    return graph_similar, jude_similar


"""
元素类型:
    直线:0
    圆弧:1
    圆:2
    样条曲线:3
邻接状态:

连接方式:
    垂直连接:0
    锐连接:1
    钝连接A:2
    钝连接B:3
    相切连接:4
    相割连接:5
    其它连接:6
尺寸约束状况:
    无尺寸约束:0
    线性尺寸:1
    直径类尺寸:2
    半径类尺寸:3
    球径类尺寸:4
    螺纹类尺寸:5
对称性:
    不对称:0
    对称:1

"""
if __name__ == '__main__':
    c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
    c2 = Cycle(1, [[2, -1, 4]], 1)
    c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
    c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
    Graph = [c1, c2, c3, c4]

    c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
    c2 = Cycle(1, [[2, -1, 4]], 1)
    c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
    c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
    Graph_re0 = [c1, c2, c3, c4]

    c1 = Cycle(4, [[1, 4, 0], [0, 1, 1], [0, 1, 1], [0, 4, 1]], 0)
    c2 = Cycle(1, [[2, -1, 3]], 1)
    c3 = Cycle(4, [[1, 5, 0], [0, 0, 1], [0, 1, 1], [0, 5, 1]], 0)
    c4 = Cycle(4, [[1, 5, 0], [0, 1, 1], [0, 0, 1], [0, 5, 1]], 0)
    Graph_re1 = [c1, c2, c3, c4]

    c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
    c2 = Cycle(1, [[2, -1, 4]], 1)
    c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
    c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
    Graph_re2 = [c1, c2, c3, c4]

    c1 = Cycle(4, [[1, 4, 0], [0, 1, 0], [0, 1, 0], [0, 4, 0]], 1)
    c2 = Cycle(1, [[2, -1, 2]], 1)
    c3 = Cycle(4, [[1, 5, 0], [1, 0, 0], [0, 1, 0], [0, 5, 0]], 0)
    c4 = Cycle(4, [[1, 5, 0], [2, 1, 0], [0, 0, 0], [0, 5, 0]], 0)
    Graph_re3 = [c1, c2, c3, c4]

    c1 = Cycle(4, [[1, 4, 0], [0, 1, 1], [0, 1, 1], [0, 4, 1]], 0)
    c2 = Cycle(1, [[2, -1, 3]], 1)
    c3 = Cycle(4, [[1, 5, 0], [0, 0, 0], [2, 1, 0], [0, 5, 0]], 0)
    c4 = Cycle(4, [[1, 5, 0], [0, 1, 0], [1, 0, 0], [0, 5, 0]], 0)
    Graph_re4 = [c1, c2, c3, c4]

    # Graph_list = [Graph_re0, Graph_re1, Graph_re2, Graph_re3, Graph_re4]

    graph_similar, jude_similar = core(Graph,Graph_re0)
    print(graph_similar)
    print(jude_similar)

与Graph_re0识别(每条弧的相似性):

与Graph_re1识别(每条弧的相似性):

与Graph_re2识别(每条弧的相似性):

与Graph_re3识别(每条弧的相似性):

与Graph_re4识别(每条弧的相似性):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值