python之logo编程

Logo标志是一种视觉符号,代表着一个品牌、企业或组织的形象。它通常采用图形、字母或字形来代表一个公司或品牌,起到对徽标拥有公司的识别和推广的作用。Logo的设计需要考虑多种因素,例如颜色搭配、字体选择和构图等,以创造出独特且易于记忆的标志。

本例实现针对给定的logo图案,生成孔位坐标供钻孔加工出logo图案,具体如下:

输入:一张logo图片,钻孔半径,孔间距。

输出:孔位坐标。

实现原理:先读取图片,然后提取轮廓,针对每个轮廓计算其x、y坐标最大值和最小值,在这些值构成的矩形内划分正交网格,网格点为候选圆心坐标点,最后以候选点是否在轮廓内为条件进行筛选,得到最终满足条件的坐标点。

图:logo示例

import cv2
import numpy as np
def generate_grid(contour, spacing):
    con=np.squeeze(contour)
    x_min= np.min(con[:, 0])
    x_max = np.max(con[:, 0])
    y_min = np.min(con[:, 1])
    y_max = np.max(con[:, 1])
    x = np.arange(x_min-spacing, x_max+spacing, spacing)
    y = np.arange(y_min-spacing, y_max+spacing, spacing)
    xx, yy = np.meshgrid(x, y)
    return xx.flatten(), yy.flatten()
​
​
def draw_circle(img, hole_coordinates, radius):
    # 将hole_coordinates转换成numpy数组
    hole_coordinates = np.array(hole_coordinates)
    # 遍历每个圆心点坐标,画圆并显示在img中
    for coordinate in hole_coordinates:
        x, y = coordinate
        cv2.circle(img, (int(x), int(y)), radius, (0, 0, 255), -1)
​
    # 显示图像
    cv2.imshow('image', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
​
​
def extract_logo_boundary(img):
    imginfo = img.shape
    height = imginfo[0]
    width = imginfo[1]
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
​
    # 二值化处理
    ret, binary = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)
​
    # 找到所有轮廓
    contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
​
    # 筛选轮廓
    logo_contours = []
    for contour in contours:
        area = cv2.contourArea(contour)
        if area > 100 and area < 0.5 * width * height:
            logo_contours.append(contour)
​
    # 在原图上绘制轮廓
    img_with_logo = img.copy()
    cv2.drawContours(img_with_logo, logo_contours, -1, (0, 0, 255), 6)
​
    # 显示图像
    cv2.imshow('Image with Logo', img_with_logo)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
​
    return logo_contours
​
​
def generate_hole_coordinates(contour, hole_spacing):
    xx, yy = generate_grid(contour, hole_spacing)
    hole_coordinates = []
    for i, j in zip(xx, yy):
        pt=(i.astype(float),j.astype(float))
        # 使用cv2.pointPolygonTest()函数判断点是否在轮廓内
        result = cv2.pointPolygonTest(contour,pt, measureDist=False)
        if result >= 0:
            hole_coordinates.append((i, j))
    return hole_coordinates
​
​
if __name__ == "__main__":
    image_path = r"C:\Usersxxx\1.jpg"
    img = cv2.imread(image_path)
    logo_boundary = extract_logo_boundary(img)
    hole_spacing = 6
    radius = 2
    hole_coordinates=[]
    for bd in logo_boundary:
        hole_coordinates+=generate_hole_coordinates(bd, hole_spacing)
    draw_circle(img, hole_coordinates, radius)
​

图:提取的logo轮廓

图:获得的孔位结果

从程序运行结果可以看出,处理环形区域内部也计算了孔位坐标外,效果还可以,需要进一步去除环形区域内的孔位点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/209643.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度优先】LeetCode1932:合并多棵二叉搜索树

作者推荐 动态规划LeetCode2552&#xff1a;优化了6版的1324模式 题目 给你 n 个 二叉搜索树的根节点 &#xff0c;存储在数组 trees 中&#xff08;下标从 0 开始&#xff09;&#xff0c;对应 n 棵不同的二叉搜索树。trees 中的每棵二叉搜索树 最多有 3 个节点 &#xff0…

程序猿无烦恼:让养生专家来写代码!!!

自己的经验&#xff0c;也是看旁边焦虑的开发总结的一些经验&#xff0c;讲道理不一定有用&#xff0c;但是道理本身一定是对的。 文章目录 持续学习少烦恼明确需求少问题少盯荧幕多冥想少吃奶茶多锻炼亲近自然要放空 持续学习少烦恼 C、JAVA、python、数据库…… 唯有持续学…

Docker下安装Tomcat

目录 Tomcat简介 Tomcat安装 免修改版Tomcat安装 Tomcat简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持&#x…

LeetCode | 965. 单值二叉树

LeetCode | 965. 单值二叉树 OJ链接 首先判断树为不为空&#xff0c;为空直接true然后判断左子树的val&#xff0c;和根的val相不相同再判断右子树的val&#xff0c;和根的val相不相同最后递归左子树和右子树 bool isUnivalTree(struct TreeNode* root) {if(root NULL)retur…

8通道16位数据采集卡方案

硬件方案--采集板 下载链接&#xff01;https://mp.weixin.qq.com/s?__bizMzU2OTc4ODA4OA&mid2247558420&idx1&sn3b1d6a99a69e68c32f425e489c21b6d5&chksmfcfaf6c3cb8d7fd52961827dedf30a79e65ed96e5b507bc5027d80f9285aa9bdcf790b940b51&token1650944467…

C/C++ 内存管理(1)

文章目录 C/C 内存划分静态和动态内存C语言的动态内存分配函数mallocfreecallocrealloc 常见内存使用错误 C/C 内存划分 栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数内局部变量的存储单元都可以在栈上创建&#xff0c;函数执行结 束时这些存储…

92基于matlab的引力搜索算法优化支持向量机(GSA-SVM)分类模型

基于matlab的引力搜索算法优化支持向量机&#xff08;GSA-SVM&#xff09;分类模型&#xff0c;以分类精度为优化目标优化SVM算法的参数c和g&#xff0c;输出分类可视化结果及适应度变化曲线。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 92 引力搜索算法…

mysql的InnoDB存储引擎

详情请参考&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html InnoDB 是一个通用目的的存储引擎&#xff0c;它在高可用性、高性能方面做了平衡。MySQL 8.0&#xff0c;InnoDB 是默认的存储引擎。在创建表的时候&#xff0c;如果没有使用ENGIN…

vmware 安装 AlmaLinux OS 8.6

选择系统镜像 选择镜像 选择安装位置和修改名称 可以自定义硬件&#xff0c;也可以不选择&#xff0c;后面可以再设置 自定义硬件可以设置内存和cpu等信息 安装虚拟机系统 密码如果简单的话需要点击两次done 才能保存

STM32 定时器TIM

单片机学习 目录 文章目录 前言 一、TIM简介 二、STM32的三种定时器 2.1基本定时器 2.1.1定时中断功能 1. 时钟源 2. 预分频器 3. 计数器 4. 自动重装寄存器 5.更新中断和更新事件 2.1.2主模式触发DAC功能 2.2 计数模式 2.2通用定时器 2.2.1 时钟源 外部时钟模式2 外部时钟模式…

使用PCReg.PyTorch项目训练自己的数据集进行点云配准

项目地址&#xff1a; https://github.com/zhulf0804/PCReg.PyTorch/tree/main 网络简介&#xff1a; 网络是基于PointNet Concat FC的&#xff0c;它没有其它复杂的结构&#xff0c;易于复现。因其简洁性&#xff0c;这里暂且把其称作点云配准的Benchmark。因作者源码中复杂…

项目实战之RabbitMQ死信队列应用

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 文章目录 &#x1f31f;架构图&#x…

SpringMVC入门详解

SpringMVC概述 开始之前了解一下三层架构 在JavaEE中我们现在几乎全用的是B/S架构&#xff0c;也就是浏览器 / 服务器架构&#xff0c;在B/S架构中&#xff0c;系统包括标准的三层架构模式&#xff1a; 1.web层&#xff08;表现层&#xff09; 它负责接收客户端请求&#x…

SIP协议在语音通信的应用方式及OKCC系统中的配置方法

在企业语音通信的过程中&#xff0c;SIP协议支持的网络通信技术通过网络为用户提供了无数的通信便利&#xff0c;已成为企业不可或缺的重要通信技术。由于SIP协议是语音通信帮助企业实现这些优势的原因&#xff0c;因此了解支持这些呼叫的SIP协议的上下文至关重要。 什么是SI…

服务器和Linux ,安装R rstudio ,常用软件

服务器的基本概念&#xff1a; 如服务器的基本结构&#xff0c;节点&#xff0c;端口的概念等。 服务器的基本设置和管理&#xff1a; 如何配置新服务器&#xff0c; 如何管理服务器&#xff0c;如何分配账户并确保他们互不访问&#xff0c; 如何全局安装软件让所有人都可以…

【数据结构】 堆排序与TopK问题详解

在学习完堆的创建后&#xff0c;就轮到了标题的两个问题 这两个问题在实际生活中会有比较强的实际问题解决能力 先分别解释一下 堆排序&#xff1a; 运用堆的思想进行排序&#xff0c;时间复杂度为O(NlogN)TopK&#xff1a; 从一大堆数据中选择K个最大或最小的数据&#xff0c…

如何本地搭建个人hMailServer邮件服务并实现远程发送邮件

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

了解c语言中的结构体

介绍&#xff1a; 在C语言中&#xff0c;结构体是一种用户自定义的数据类型&#xff0c;它允许我们将不同类型的数据组合在一起&#xff0c;形成一个更为复杂的数据结构。结构体可以用来表示现实世界中的实体&#xff0c;如人员、学生、图书等。本篇博客将介绍结构体的基本概念…

Postgresql分区表

PostgreSQL 提供了三种分区表实现方式&#xff1a; range &#xff1a;范围分区list &#xff1a;列表分区hash &#xff1a;哈希分区 一、范围分区 根据某个字段的值&#xff0c;将数据存入不同的分区表中。 创建父表 create table test_person_table (name varchar(64),ag…

SpringSecurity工作原理

实现功能就是继承这几个对应功能的类。 大概工作流程 Spring Security 的过滤器&#xff08;Filters&#xff09;和拦截器&#xff08;Interceptors&#xff09;是 Spring Security 框架中用于保护 web 应用安全的重要组件。它们在处理 HTTP 请求时扮演不同的角色&#xff0c…