python+openCV使用SIFT算法实现印章的总相似度检测

这篇具有很好参考价值的文章主要介绍了python+openCV使用SIFT算法实现印章的总相似度检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python实现,使用SIFT算法和文字相似度检测算法,并使用了pyqt5做的印章相似度检测工具,还有很大优化空间,对于我这水平费了不少力气,记录一下。

首先整体流程是预建了一个印章库,包含若干张图片。目的是输入一张印章图片,与库里图片对比,最终显示相似度最高的三张。记一下关键代码。
python+openCV使用SIFT算法实现印章的总相似度检测,opencv,python,opencv,算法

1.图像预处理

主要是红色区域提取、常规灰度二值、对于形态不好的图片做个腐蚀啥的。

def GetRed(img):
    """
    提取图中的红色部分
    """
    # 转化为hsv空间
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 颜色在HSV空间下的上下限156-180还能改成0-10
    low_hsv = np.array([156, 43, 46])
    high_hsv = np.array([180, 255, 255])

    # 使用opencv的inRange函数提取颜色
    mask = cv2.inRange(hsv, lowerb=low_hsv, upperb=high_hsv)
    Red = cv2.bitwise_and(img, img, mask=mask)

    return Red

2.做一个霍夫圆打开,方便后续文字识别

# 霍夫圆检测
def houghCircle(src):
    gray = cv2.medianBlur(src, 3)
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, \
                               100, param1=200, param2=30, minRadius=200, maxRadius=300)
    isNG = False
    if circles is None:
        print("找圆失败")
    else:
        circles = np.uint16(np.around(circles))
        a, b, c = circles.shape
        for i in range(b):
            cv2.circle(src, (circles[0][i][0], circles[0][i][1]), circles[0][i][2], (0, 0, 255), 3, cv2.LINE_AA)
            cv2.circle(src, (circles[0][i][0], circles[0][i][1]), 2, (0, 255, 0), 3,
                       cv2.LINE_AA)  # draw center of circle

    x = circles[0][i][0] - circles[0][i][2]
    y = circles[0][i][1] - circles[0][i][2]
    w = h = 2 * circles[0][i][2]
    center = (circles[0][i][0], circles[0][i][1])
    radius = circles[0][i][2]
    c = 2 * np.math.pi * radius
    print(c, radius)

    ROI = src[y:y + h, x:x + h].copy()
    trans_center = (center[0] - x, center[1] - y)
    polarImg = cv2.warpPolar(ROI, (int(radius), int(c)), trans_center, radius, cv2.INTER_LINEAR + cv2.WARP_POLAR_LINEAR)
    polarImg = cv2.flip(polarImg, 1)  # 镜像
    polarImg = cv2.transpose(polarImg)  # 转置
    # cv2.imshow('polarImg', polarImg)
    cv2.imwrite('polarImg.png', polarImg)
    return src

3.构建图像标准名称库

# 获取标准库txt数据
        txtData = openreadtxt('../trainText/Imglist.txt')

4.识别文字

识别文字部分使用的是PaddleOCR文章来源地址https://www.toymoban.com/news/detail-718277.html

def paddleOcr(src):
    ocr = PaddleOCR(use_angle_cls=True, lang='ch')  # need to run only once to download and load model into memory
    img_path = src
    result = ocr.ocr(img_path, cls=True)
    # print('--------------------------result-----------------------------------')
    # print(result)
    # print('--------------------------line-----------------------------------')
    for idx in range(len(result)):
        res = result[idx]
        for line in res:
            print(line)
    result = result[0]
    image = Image.open(img_path).convert('RGB')
    boxes = [line[0] for line in result]
    txts = [line[1][0] for line in result]
    scores = [line[1][1] for line in result]
    # print('--------------------------boxes-----------------------------------')
    # print(boxes)
    # print('--------------------------txts-----------------------------------')
    # print(txts)
    # print('--------------------------scores-----------------------------------')
    # print(scores)

    im_show = draw_ocr(image, boxes, txts, scores)
    im_show = Image.fromarray(im_show)
    im_show.save('result.jpg')
    return txts

5.计算一下文字的相似度

 # 计算文字相似度
        for i in range(len(txtData)):
            Str = txtData[i]
            s1 = textRes

            txt_replace = str(txtData[i]).replace('[', '')
            txt_replace = txt_replace.replace(']', '')
            txt_replace = txt_replace.replace("'", '')
            imgPath = '../trainImg/' + txt_replace + '.jpg'
            simPic = matplotlib2opencv(imgPath)
            simPic_resize = cv2.resize(simPic, (500, 500))
            print('----------------------文字相似度-----------------------------')
            sim = difflib.SequenceMatcher(None, str(Str), str(s1)).quick_ratio()
            print(sim)

6.很常规的图片相似度检测(SIFT)

def picRec(image_label, image_rec):
    # 预处理
    imgRec_res = cv2.resize(image_rec, (image_label.shape[1], image_label.shape[0]))
    imgRec_gray = imgToGray(imgRec_res)

    # 关键点检测
    kp1, des1 = getKeyPoint(image_label)
    kp2, des2 = getKeyPoint(imgRec_gray)
    print("图片1的关键点数目:" + str(len(kp1)))
    print("图片2的关键点数目:" + str(len(kp2)))

    # 绘制
    # imgCir1 = cv2.drawKeypoints(img1, kp1, img1_gray, color=(255, 0, 255))  # 画出特征点,并显示为红色圆圈
    # imgCir2 = cv2.drawKeypoints(img2, kp2, img2_gray, color=(255, 0, 255))  # 画出特征点,并显示为红色圆圈

    # BFMatcher解决匹配
    bf = cv2.BFMatcher()
    matches = bf.knnMatch(des1, des2, k=2)
    # print(matches)
    # print(len(matches))
    # 调整ratio
    good = []
    for m, n in matches:
        if m.distance < 0.9 * n.distance:
            good.append([m])
    print("总体特征数量:" + str(len(matches)))
    print("相似特征数量:" + str(len(good)))
    imgSim = len(good) / len(kp1) * 100
    print("图片相似度为:" + str(imgSim) + str('%'))
    return imgSim

7.最后就是在pyqt上显示图片,像我如果要显示前三张,就需要写三段下面的代码,放入不同的QGraphicsVies里就行了。

  # 图片显示
        txt_replace1 = str(textArr[0][0]).replace('[', '')
        txt_replace1 = txt_replace1.replace(']', '')
        txt_replace1 = txt_replace1.replace("'", '')
        print(txt_replace1)
        path = '../trainImg/' + txt_replace1 + '.jpg'
        img_1 = QtGui.QPixmap(path).scaled(self.graphicsView_2.width(), self.graphicsView_2.height())
        # 在QGraphicsView控件上显示选择的图片
        scene1 = QtWidgets.QGraphicsScene()
        scene1.addPixmap(img_1)  # 將图片加入 scene
        self.graphicsView_2.setScene(scene1)  # 设定 QGraphicsView 的场景為 scene
        self.label_2.setText(str(round(textArr[0][3], 1)) + '%')

7.整理记录时候发现,真的有很多能优化的地方,慢慢学,慢慢写吧。

到了这里,关于python+openCV使用SIFT算法实现印章的总相似度检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记:Opencv实现图像特征提取算法SIFT

    2023.8.19 为了在暑假内实现深度学习的进阶学习,特意学习一下传统算法,分享学习心得,记录学习日常 SIFT的百科: SIFT = Scale Invariant Feature Transform, 尺度不变特征转换 全网最详细SIFT算法原理实现_ssift算法_Tc.小浩的博客-CSDN博客 在环境配置中要配置opencv: pip install opencv-c

    2024年02月12日
    浏览(26)
  • OpenCV使用SURF和SIFT算法报错解决记录

    OpenCV使用SURF和SIFT算法报错解决记录 1.报错代码,使用以下两种写法都会报错 第一种报错 AttributeError: module ‘cv2’ has no attribute ‘xfeatures2d’ 第二种报错 AttributeError: module ‘cv2’ has no attribute ‘SURF_create’ 2.查找网络上的解决办法,大部分分为两种 SIFT和SURF算法申请了专利,

    2024年02月07日
    浏览(26)
  • 【教程】Autojs使用OpenCV进行SIFT/BRISK等算法进行图像匹配

    转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]         此代码可以替代内置的images.findImage函数使用,但可能会误匹配,如果是对匹配结果要求比较高的,还是得谨慎使用。

    2024年02月07日
    浏览(33)
  • 【Python】:SIFT算法的实现

    ✨博客主页:王乐予🎈 ✨年轻人要:Living for the moment(活在当下)!💪 🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】 本文侧重于如何使用Python语言实现SIFT算法 所有程序已打包 :基于OpenCV-Python的SIFT算法的实现   SIFT,即尺度不变特征变换(

    2024年02月01日
    浏览(17)
  • SIFT 算法 | 如何在 Python 中使用 SIFT 进行图像匹配

    人类通过记忆和理解来识别物体、人和图像。你看到某件事的次数越多,你就越容易记住它。此外,每当一个图像在你的脑海中弹出时,它就会将该项目或图像与一堆相关的图像或事物联系起来。如果我告诉你我们可以使用一种称为 SIFT 算法的技术来教机器做同样的事情呢?

    2024年02月13日
    浏览(28)
  • 使用opencv实现图片相似度检测

    1.为什么学这个,我对图像处理非常感兴趣,我联想到海尔的指纹识别门锁是如何进行检测的,我在想不应该呀,单片机性能这么差,应该是使用了训练后的数据去检测图片的,如果我要实现草莓检测,知道它是不是草莓,我觉得单纯使用图片处理是不够的,我考虑过使用指纹模块来接触

    2024年02月05日
    浏览(26)
  • 【Opencv实战】Python神器 | ps做印章太麻烦?无法拒绝的提取印章神技能,很多人都不知道~(附源码)

    哈喽,大家好,我是你们的栗子同学鸭~ 更新了很久的爬虫内容啦,已经吸收完了没? 印章作是我们工作中和生活中会经常接触到的东西 ,一般用来代表某个个体或者群体,有时候 我们需要复刻一些文件,或者是作品上的印章等等情况时, 就需要我们提取一些电子印章。

    2023年04月09日
    浏览(27)
  • opencv的SIFT样例(CPP/python)

    结论说明: 两种代码在同一个环境上的,相同的图片大小和数量(19张图片),运行耗时如下: python c++ 差距不会很明显,但是如果文件很多,并且使用多线程/多进程,会有一个比较明显的差距。

    2024年01月19日
    浏览(25)
  • Lesson4-3:OpenCV图像特征提取与描述---SIFT/SURF算法

    学习目标 理解 S I F T / S U R F SIFT/SURF S I FT / S U RF 算法的原理, 能够使用 S I F T / S U R F SIFT/SURF S I FT / S U RF 进行关键点的检测 1.1 SIFT原理 前面两节我们介绍了 H a r r i s Harris H a rr i s 和 S h i − T o m a s i Shi-Tomasi S hi − T o ma s i 角点检测算法,这两种算法具有旋转不变性,但不具

    2024年02月09日
    浏览(29)
  • OpenCV书签 #结构相似性SSIM算法的原理与图片相似性实验

    结构相似性(Structural Similarity,简称SSIM算法) ,主要用于检测两张相同尺寸的图像的相似度、或者检测图像的失真程度,是一种衡量两幅图像相似度的指标。 给定两个图像 x 和 y,两张图像的结构相似性可按照以下方式求出: 结构相似性的范围为 -1 到 1。当两张图像一模一

    2024年01月24日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包