• OpenCV中的形态学8


    形态学概述

    在这里插入图片描述
    开运算:先做腐蚀后做膨胀(腐蚀可以理解为缩小)
    闭运算:先膨胀后腐蚀
    在这里插入图片描述
    在这里插入图片描述

    图像全局二值化

    低于threshold就置为0,高于threshold就置为255
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    img = cv2.imread('E://pic//9.jpg')
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    ret, dst = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY)
    print(dst.shape)
    
    cv2.imshow('img', img)
    cv2.imshow('gray', img2)
    cv2.imshow('bin', dst)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    img = cv2.imread('E://pic//9.jpg')
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    ret, dst = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY_INV)
    print(dst.shape)
    
    cv2.imshow('img', img)
    cv2.imshow('gray', img2)
    cv2.imshow('bin', dst)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    img = cv2.imread('E://pic//9.jpg')
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    ret, dst = cv2.threshold(img2, 60, 255, cv2.THRESH_BINARY)
    ret, dst2 = cv2.threshold(img2, 60, 255, cv2.THRESH_BINARY_INV)
    print(dst.shape)
    
    cv2.imshow('img', img)
    cv2.imshow('gray', img2)
    cv2.imshow('bin', dst)
    cv2.imshow('bin2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    阈值类型

    在这里插入图片描述

    自适应阈值二值化

    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    # img = cv2.imread('E://pic//9.jpg')
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('gray', cv2.WINDOW_NORMAL)
    cv2.namedWindow('bin', cv2.WINDOW_NORMAL)
    cv2.namedWindow('bin2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./math.png')
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    ret, dst = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY)
    ret, dst2 = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY_INV)
    print(dst.shape)
    
    cv2.imshow('img', img)
    cv2.imshow('gray', img2)
    cv2.imshow('bin', dst)
    cv2.imshow('bin2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('gray', cv2.WINDOW_NORMAL)
    cv2.namedWindow('bin', cv2.WINDOW_NORMAL)
    cv2.namedWindow('bin2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./math.png')
    img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    dst = cv2.adaptiveThreshold(img2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 0)
    dst2 = cv2.adaptiveThreshold(img2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)
    
    cv2.imshow('img', img)
    cv2.imshow('gray', img2)
    cv2.imshow('bin', dst)
    cv2.imshow('bin2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    OpenCV腐蚀

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    img = cv2.imread('./j.png')
    kernel = np.ones((3, 3), np.uint8)
    dst = cv2.erode(img, kernel, iterations=1)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    获取形态学卷积核

    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    img = cv2.imread('./j.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    print(kernel)
    dst = cv2.erode(img, kernel, iterations=1)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    OpenCV膨胀

    原来黑色区域变成白色
    在这里插入图片描述
    卷积核大小意味着膨胀的速度,卷积核越大膨胀越快
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    img = cv2.imread('./j.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    print(kernel)
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    dst = cv2.dilate(img, kernel, iterations=1)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./j.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    print(kernel)
    # 腐蚀
    dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./j.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    print(kernel)
    # 腐蚀
    dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    开运算

    开运算能达到消除噪点的效果
    在这里插入图片描述
    在这里插入图片描述
    对噪点比较大的图像,我们用大的卷积核,消除噪点能力更强
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./dotj.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    # print(kernel)
    # 腐蚀
    dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./dotj.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    # print(kernel)
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    # dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    # cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述

    闭运算

    闭运算消除里面的噪点,开运算消除外面的噪点
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./dotinj.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    # print(kernel)
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    # dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    # dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    # cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    在这里插入图片描述
    噪点比较大就要大一点的卷积核
    在这里插入图片描述

    形态学梯度

    可以求边缘
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./j.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    # print(kernel)
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    # dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    # 开运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    # 闭运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    
    dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    # cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述
    因为7x7的kernel太大,腐蚀太多,造成里面的黑线很少

    现在我们换成3x3的kernel

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./j.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    # print(kernel)
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    # dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    # 开运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    # 闭运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    
    dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    # cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    顶帽运算

    获取的是外面的噪点
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    # cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./tophat.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19))
    # print(kernel)
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    # dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    # 开运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    # 闭运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    # 形态学梯度
    # dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    
    # 顶帽运算
    dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    # cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

    黑帽操作

    获取图内的噪点
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    import cv2
    import numpy as np
    
    # cv2.namedWindow('img', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
    # cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
    img = cv2.imread('./dotinj.png')
    # kernel = np.ones((7, 7), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    # print(kernel)
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=1)
    # 膨胀
    # dst2 = cv2.dilate(dst, kernel, iterations=1)
    
    # 开运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    # 闭运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    # 形态学梯度
    # dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    
    # 顶帽运算
    # dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    
    # 黑帽操作
    dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    
    cv2.imshow('img', img)
    cv2.imshow('dst', dst)
    # cv2.imshow('dst2', dst2)
    
    key = cv2.waitKey(0) & 0xff
    if key == ord('q'):
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这里插入图片描述

    小结

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

  • 相关阅读:
    防火墙技术之安全区域
    kubernetes之常用核心资源对象
    Windows端口号被占用的查看方法及解决办法
    Docker下Jenkins打包java项目并部署
    Spark源码(创建与yarn集群交互的client并运行)-第一期
    【网工必备】CIDR-路由聚合你了解了没!?
    怎样在小程序中直播
    Nginx知识汇总
    【Python爬虫】requests库get和post方法使用
    实战:redux的基本使用
  • 原文地址:https://blog.csdn.net/qq_44631615/article/details/134459650