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 = coordinatecv2.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.shapeheight = 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 = 6radius = 2hole_coordinates=[]for bd in logo_boundary:hole_coordinates+=generate_hole_coordinates(bd, hole_spacing)draw_circle(img, hole_coordinates, radius)
图:提取的logo轮廓
图:获得的孔位结果
从程序运行结果可以看出,处理环形区域内部也计算了孔位坐标外,效果还可以,需要进一步去除环形区域内的孔位点。