图像分割 您所在的位置:网站首页 xa和ax图像 图像分割

图像分割

2023-07-09 08:50| 来源: 网络整理| 查看: 265

问题:请检测出下图中的不同大小的硬币数目与线条数。

霍夫变换(Hough Transform)是一种在数字图像处理中,用于检测特定形状的算法。它最初由霍夫(Hough)于1962年提出,用于检测直线。后来,霍夫变换被扩展用于检测各种形状,如圆、椭圆等。

其基本原理是将图像中的像素点在参数空间中进行映射,从而在参数空间中形成一条曲线,当曲线在某些位置交叉时,则说明在原始图像中存在所要检测的特定形状。参数空间可以是直线的极坐标空间,也可以是圆或椭圆的参数空间。

以检测直线为例,假设在一幅图像中,有一条直线y=ax+b,将其表示为参数空间(a,b)上的一点,则对于图像中的每个点(x,y),都可以在(a,b)空间中找到对应的曲线,形成一条曲线。如果在(a,b)空间中,有多条曲线在某一点相交,则说明在原始图像中存在一条直线。

霍夫变换的优点在于它对于图像中的噪声、缺失等问题有较好的容错性,可以检测出不连续的形状,而且对于不同的形状可以采用不同的参数空间表示,因此具有较大的灵活性。缺点在于对于较复杂的形状,计算量较大。

import cv2 import numpy as np # 读取图像并转换为灰度图像 img = cv2.imread('2-2.jpg') h = img.shape[0] w = img.shape[1] gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 运行HoughLines函数以检测直线 edges = cv2.Canny(gray, 180, 200, apertureSize=3) lines = cv2.HoughLines(edges, 2, np.pi / 180, 260) # 筛选出多余检测的直线边缘 list_line = [] list_index = [] for line in lines: rho, theta = line[0] list_line.append([rho, theta]) list_line.sort(key=lambda x: x[0]) for i in range(len(list_line) - 1): if list_line[i + 1][0] - list_line[i][0] < 10: list_index.append(i) else: pass # 绘制检测到的直线 for i in range(len(list_line)): if i in list_index: pass else: rho, theta = list_line[i] a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 500 * (-b)) y1 = int(y0 + 500 * (a)) x2 = int(x0 - 500 * (-b)) y2 = int(y0 - 500 * (a)) cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) print('直线的数量:', len(list_line) - len(list_index)) # 运行HoughCircles函数以检测圆圈 circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 100, param1=100, param2=50, minRadius=10, maxRadius=100) # 绘制检测到的圆圈 for circle in circles[0]: x, y, r = circle cv2.circle(img, (x, y), r, (0, 0, 255), 2) print('硬币的数量:', len(circles[0])) # 显示结果 cv2.imshow('image', img) cv2.imwrite('result.png', img) cv2.waitKey(0) cv2.destroyAllWindows()

结果图:

 可以看到图中的直线和大小不同的硬币基本都被检测了出来,数量也是正确的。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有