python Blob检测圆点

2023-10-27

blob只能检测里面是黑色外面是白色的斑点

如果要检测里面是白色外面是黑色的斑点,则图像要取反

img_inv = 255 - img

原图

 

检测结果图

plt

 opencv

 

# coding:utf-8
import math
import cv2
import numpy as np
import xml.etree.ElementTree as ET
import random
import matplotlib.pyplot as plt



def get_distance_point2line(point, line_ab):    # 求点到直线的距离
    """
    Args:
        point: [x0, y0]
        line_ab: [k, b]
    """
    k, b = line_ab
    distance = abs(k * point[0] - point[1] + b) / math.sqrt(k ** 2 + 1)
    return distance


# 没有考虑垂直和水平线的情况
def drawLines(img, allCirclesCenter):
    # 计算两排点的中心线
    nptest = np.array(allCirclesCenter)
    line = cv2.fitLine(nptest, cv2.DIST_L2, 0, 0.001, 0.0)
    # print(line)
    k = line[1] / line[0]
    b = line[3] - k * line[2]

    # 如果是水平线
    if k <= 10e-5:
        pass
    # 如果是垂直
    if k > 10e5:
        pass


    print('y = {:0.8f}x + {:0.8f}'.format(k[0], b[0]))
    ptStart, ptEnd = (0, int(k * 0 + b)), (img.shape[1], int(k * img.shape[1] + b))
    # 坐标点取得整数需要修改***************  画一线占满整个图片的线
    cv2.line(img, ptStart, ptEnd, (0, 0, 255), thickness=2, lineType=3)
    # cv2.imshow("line", img)
    # cv2.waitKey()

    # 区分上下各点,拟合两条直线
    line1_yx, line2_yx = [], []
    for i in allCirclesCenter:
        if i[1] < float(k * i[0] + b):
            line1_yx.append(i)
        else:
            line2_yx.append(i)

    # line1 求第一条直线
    nptest1 = np.array(line1_yx)
    line1 = cv2.fitLine(nptest1, cv2.DIST_L2, 0, 0.01, 0.0)
    k1 = line1[1] / line1[0]
    b1 = line1[3] - k1 * line1[2]
    # print(line1)
    print('line1')
    print('y = {:0.8f}x + {:0.8f}'.format(k1[0], b1[0]))

    for i in line1_yx:  # 显示点到直线的距离
        point = i
        line_ = k1, b1
        dis = get_distance_point2line(point, line_)
        # print('距离: ' + str(dis))

    ptStart, ptEnd = (0, int(k1 * 0 + b1)), (img.shape[1], int(k1 * img.shape[1] + b1))# 坐标点取得整数需要修改***************
    cv2.line(img, ptStart, ptEnd, ( 255, 0, 0), 2)
    # cv2.imshow("line1", img)


    # lin2 求第二条直线
    nptest2 = np.array(line2_yx)
    line2 = cv2.fitLine(nptest2, cv2.DIST_L2, 0, 0.01, 0.0)
    k2 = line2[1] / line2[0]
    b2 = line2[3] - k2 * line2[2]
    # print(line2)
    print('line2')
    print('y = {:0.8f}x + {:0.8f}'.format(k2[0], b2[0]))
    ptStart, ptEnd = (0, int(k2 * 0 + b2)), (img.shape[1], int(k2 * img.shape[1] + b2)) # 坐标点取得整数需要修改***************
    cv2.line(img, ptStart, ptEnd, ( 255, 0, 0), 2)  # 像素值必须是整数****************
    # cv2.imshow("line2", img)
    # cv2.waitKey()
    imgNormal = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    plt.imshow(imgNormal)
    plt.show()



def mainFigure(img):
    paramsOut = cv2.SimpleBlobDetector_Params()
    # Setup SimpleBlobDetector parameters.
    # print('params')
    # print(params)
    # print(type(params))

    # Filter by Area.
    paramsOut.filterByArea = True
    paramsOut.minArea = 5000
    paramsOut.maxArea = 10e3
    paramsOut.minDistBetweenBlobs = 25
    paramsOut.filterByColor = True
    paramsOut.filterByConvexity = False
    paramsOut.minThreshold = 10
    paramsOut.maxThreshold = 30*2.5
    # tweak these as you see fit
    # Filter by Circularity
    # params.filterByCircularity = False
    # params.minCircularity = 1
    # params.blobColor = 0
    # # # Filter by Convexity
    # params.filterByConvexity = True
    # params.minConvexity = 1
    # Filter by Inertia
    # params.filterByInertia = True
    # params.filterByInertia = False
    # params.minInertiaRatio = 0.1


    gray_src= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # Detect blobs.
    # image = cv2.resize(gray_img, (int(img.shape[1]/4),int(img.shape[0]/4)), 1, 1, cv2.INTER_LINEAR)
    # image = cv2.resize(gray_img, dsize=None, fx=0.25, fy=0.25, interpolation=cv2.INTER_LINEAR)
    minThreshValue = 35
    _, gray = cv2.threshold(gray_src, minThreshValue, 255, cv2.THRESH_BINARY)
    gray = cv2.resize(gray, dsize=None, fx=1, fy=1, interpolation=cv2.INTER_LINEAR)
    # cv2.imshow("gray1",gray)

    kernel = np.ones((3, 3), dtype=np.uint8)
    gray = cv2.dilate(gray, kernel, 1)  # 1:迭代次数,也就是执行几次膨胀操作
    gray = cv2.erode(gray, kernel, 1)
    # plt.imshow(gray)
    # cv2.imshow("gray",gray)

    # 找到距离原点(0,0)最近和最远的点
    # 检测外侧圆
    detector = cv2.SimpleBlobDetector_create(paramsOut)
    keypoints = detector.detect(gray)
    # opencv
    im_with_keypoints = cv2.drawKeypoints(gray, keypoints, np.array([]), (255, 0, 0),  cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    # im_with_keypoints = cv2.drawKeypoints(img, keypoints, np.array([]), (0, 255, 0), cv2.DRAW_MATCHES_FLAGS_DEFAULT)
    # print(keypoints)
    # cv2.imshow("zero_gray", gray)




    # 检测内侧圆 图像取反
    paramsIn = cv2.SimpleBlobDetector_Params()
    paramsIn.filterByArea = True
    paramsIn.minArea = 100
    paramsIn.maxArea = 500
    paramsIn.minDistBetweenBlobs = 10
    paramsIn.filterByColor = True
    paramsIn.filterByConvexity = False
    paramsIn.minThreshold = 30
    paramsIn.maxThreshold = 30*2.5
    # 图像取反
    needleGray = 255 - gray.copy()
    cv2.imshow('needleGray', needleGray)
    detector2 = cv2.SimpleBlobDetector_create(paramsIn)
    needleKeypoints = detector2.detect(needleGray)
    # opencv
    needle_keypoints = cv2.drawKeypoints(needleGray, needleKeypoints, np.array([]), (255, 0, 0),
                                          cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

    allNeedlePoints = []
    if keypoints is not None:
        for i in range(len(needleKeypoints)):
            allNeedlePoints.append(needleKeypoints[i].pt)

    # 不可能大多数是斜的,直接按照大多数的点集拟合即可
        # print(allCirclesCenter)
    # if allCirclesCenter is not None:
    if len(allNeedlePoints) > 10:
        drawLines(needle_keypoints, allNeedlePoints)


    color_img = cv2.cvtColor(im_with_keypoints, cv2.COLOR_BGR2RGB)
    needle_img = cv2.cvtColor(needle_keypoints, cv2.COLOR_BGR2RGB)


    cv2.imshow('holeShow', color_img)
    cv2.imshow('needleShow', needle_img)

    cv2.waitKey()



if __name__ == "__main__":

    # # # 单张图片测试
    # img = cv2.imread("images/HenFeng/HF01.jpg",1)
    # img = cv2.imread("images/Snap_0.jpg",1)
    # img = cv2.imread("images/Holes/Hole2.jpg",1)
    # mainFigure(img)

    # # 所有图片测试
    for i in range(5):
        fileName = "Zhen" + str(i+1) + ".jpg"
    # img = cv2.imread("circles/Snap_007.jpg",1)
        img = cv2.imread("images/ZhenJiao/" + fileName,1)
        print(fileName)
        mainFigure(img)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python Blob检测圆点 的相关文章

  • MySQL 5.6解压缩版安装配置方法图文教程(win10)

    MySQL 5 6解压缩版安装配置方法图文教程 win10 1 首先 我们需要得到这个安装包 解压下载到本地 可在小编网盘中找到 我已共享链接 可直接下载 比如 现在我们把他解压到我们本地的D MySQL文件夹下 现在我们就可以看到 当前目

随机推荐

  • 【WiFi】Wi-Fi 6(802.11ax)解析24:802.11ax中MU-MIMO和OFDMA的区别

    目录 1 序言 2 OFDMA 2 MU MIMO 3 MAC层部分 MU MIMO和OFDMA 4 结语 5 参考 1 序言 笔者将自己对于802 11ax中的MU MIMO和OFDMA的区别做了一个简单的总结 因为很多非通信技术专业的童
  • 临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别

    TRtlCriticalSection 是一个结构体 在windows单元中定义 TCriticalSection是在SyncObjs单元中实现的类 它对上面的那些临界区操作API函数进行了了封装 简化并方便了在Delphi的使用 如TCr
  • 用C语言开发一个BT下载软件 (四) ------ 代码实现-1-种子文件解析模块

    parse metafile h ifndef PARSE METAFILE define PARSE METAFILE 保存从种子文件中获取的tracker的URL typedef struct Announce list char an
  • 数据库建索引规则

    数据库建立索引常用的规则如下 1 表的主键 外键必须有索引 2 数据量超过300的表应该有索引 3 经常与其他表进行连接的表 在连接字段上应该建立索引 4 经常出现在Where子句中的字段 特别是大表的字段 应该建立索引 5 索引应该建在选
  • 微信小程序分包-主包尺寸 (不包合插件) 应小于 1.5 M

    目录 起因 分包 最后 起因 更新一个之前的小程序 上传的时候提示主包尺寸 不包合插件 应小于 1 5 M 怎么办 查看教程啊 开发者可通过开发者工具中的性能扫描工具提前发现代码中的可优化项 1 代码包不包含插件大小超过 1 5 M 建议
  • 迭代(iterable)和迭代器

    迭代 iterable 任何可迭代对象都可以作用于for循环 包括我们自定义的数据类型 只要符合迭代条件 就可以使用for循环 d a 1 b 2 c 3 对dict迭代 for k v in d items 如果要同时迭代key和valu
  • 文件操作之日志文件

    一 前言 用户 那谁 你的程序出问题了 来看看 你 问题是怎么出现的 为了复现 用户 我也不知道 就这样点点点就出问题了 你 这个时候 日志文件的重要性就凸显出来了 别指望用户能描述清楚问题出现的经过 最靠谱的还是看日志文件 二 多说两句
  • 网站开发————JavaEE/实训实训实训

    JavaEE 搭建Maven 1 下载 2 环境变量 3 设置 依赖包位置 IntelliJ 1 链接Maven 2 建项目 无框架 3 建Model maven webapp 4 建java resoure并关联 4 导入依赖到pom x
  • Spring 事件驱动,自定义事件、应用监听器

    目录 概述 源码分析 ApplicationEvent 应用事件 spring中常见的事件类型 ApplicationListener 应用监听器 ApplicationEventPublisher 事件发布器 自定义事件 自定义应用监听器
  • 10大python加速技巧

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • vue3 tif文件解析预览

    tif文件在img标签中是无法正常解析的 需要转成常见的jpg png等格式才能正常显示 经过调研 就常见的几种方式 tiff js或者别的插件 本次文章主要讲tiff文件解析时出现的一些问题 1 下载tiff js npm install
  • 后台数据与前端数据进行传递交互

    前端后端对应数据的传递 model前端 数据从数据库 到 Model User类 再到 Controller new User 再到 View html css 最后在浏览器中看到 Model 在 MVC 框架的角色是 有很多字段组成的数据
  • 数论学习-初等数论基础总览

    文章目录 初等数论基础 二 建议先看 零 同余与逆元的概念 0 1 同余 0 2 逆元概念 0 2 1 逆元的求法 一 数论只会gcd 1 1 gcd 1 1 1 a b a a b 的证明 1 1 2 a b b a b 的证明 辗转相除
  • 如何监控阿里云服务器的java进程

    如何监控阿里云服务进程 阿里云的监控没有具体到监控哪一个进行的监控项 如果我们想监控特定的进程建议使用自定义监控 自己采集监控数据 但是阿里提供了关键字的监控 我们可以使用关键字查询进程的数量进行监控 下面我就带大家来试一试如何监控一台服务
  • 【产品设计】90天产品经理实战 分析

  • Git检出(git权威指南笔记)

    HEAD 头指针 是当前工作区的基础版本 看到当前处于的分支 git branch v 分离头指针 git checkout 4902dc3 处于分离头指针状态 可以检查 测试和提交 而不影响任何分支 通过执行另外的一个checkout检出
  • python基础------字符串、列表、元组、字典、集合、函数

    1 字符串 2 列表 列表的删除方法 2 1 列表的增 删 改 查 排序 遍历 a 创建一个空列表 ls b 向列表中添加元素 红烧鸡翅 并查看列表 ls append 红烧鸡翅 c 接着向列表中最前面添加1个元素 32 并查看列表 ls
  • 添加“Git Bash Here”到右键菜单

    之前安装了git的时候 清晰的记得右键菜单里是有 Git Bash Here 这个选项的 非常方面 后来不知道为啥突然没有了 就像搞回来 打开注册表 定位到HKEY CLASSES ROOT Directory Background she
  • centos7.6内核升级

    1 上传一个高版本的系统镜像到服务器上 并挂载到目录 2 配置本地镜像的yum源 mount o loop root kernel CentOS 7 7 x86 64 DVD 1908 iso mnt cdrom vim etc yum r
  • python Blob检测圆点

    blob只能检测里面是黑色外面是白色的斑点 如果要检测里面是白色外面是黑色的斑点 则图像要取反 img inv 255 img 原图 检测结果图 plt opencv coding utf 8 import math import cv2