首页 > 编程问答 >OpenCV 计算图像上的三角形

OpenCV 计算图像上的三角形

时间:2024-07-28 05:38:44浏览次数:10  
标签:python opencv computer-vision

我们如何计算该图像中的三角形:

enter image description here

首先,我们需要消除颜色噪声。然后我们可以尝试 cv2.Canny 和 cv2.findCountours。但是 cv2.findCountours 如何区分各个交叉形状?

我尝试了这个:

img = cv2.fastNlMeansDenoisingColored(img, None, 6, 6)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

enter image description here

结果不好......


以下是如何使用 OpenCV 在 Python 中计算图像中三角形的数量:

import cv2

# 读取图像
image = cv2.imread("triangles.png")

# 将图像转换为灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 对图像应用阈值处理
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)[1]

# 使用形态学运算来清理图像
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=3)

# 查找轮廓
cnts = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# 循环遍历轮廓
triangle_count = 0
for c in cnts:
    # 使用周长和面积比来逼近形状
    perimeter = cv2.arcLength(c, True)
    area = cv2.contourArea(c)
    if perimeter > 0:  # 避免被零除
        compactness = 4 * cv2.pi * area / (perimeter**2)

        # 三角形的紧实度值较低
        # 调整此阈值以适应你的图像
        if compactness > 0.15:
            cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
            triangle_count += 1

# 显示结果
print("三角形数量:", triangle_count)
cv2.imshow("Result", image)
cv2.waitKey(0)

解释:

  1. 预处理:
  2. 将图像转换为灰度以进行简单的处理。
  3. 对图像应用阈值处理以创建二值图像。
  4. 使用形态学运算(膨胀后腐蚀)来清理图像,关闭小的间隙和孔洞。

  5. 查找轮廓:

  6. 使用 cv2.findContours 函数查找二值图像中的轮廓。
  7. 使用 cv2.RETR_EXTERNAL 仅检索外部轮廓。

  8. 分析轮廓和计数三角形:

  9. 循环遍历每个轮廓并计算其周长和面积。
  10. 计算紧实度(也称为形状因子),定义为 (4 * pi * 面积) / (周长)^2 。该值对于圆形接近 1,而对于更复杂的形状则较低。
  11. 通过实验确定一个阈值紧实度值,以区分三角形和其他形状。
  12. 如果一个轮廓的紧实度高于阈值,则将其计为三角形,并在原始图像上绘制该轮廓以进行可视化。

  13. 显示结果:

  14. 打印检测到的三角形的总数。
  15. 显示结果图像,其中突出显示了检测到的三角形。

注意:

  • 可能需要根据你的特定图像调整形态学运算的内核大小和迭代次数,以及紧实度阈值。
  • 此方法依赖于形状紧实度,并且可能无法在所有情况下完美地识别所有三角形,尤其是在形状严重扭曲或部分被遮挡的情况下。你可能需要探索更强大的形状检测技术或结合其他特征以获得更稳健的结果。

标签:python,opencv,computer-vision
From: 78802493

相关文章

  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......
  • python错题记录:布尔运算与逻辑值检测
    一前言环境:python3.10win10二布尔运算与逻辑值检测1案例案例1如上,在布尔运算时,有些时候代码只会运算前面的一部分,剩下的部分根本不会运算。以前在练习算法代码时,就利用这个规则来减少代码的工作量案例2如上,之前好长一段时间,上面的布尔运算总是让我感到困惑布尔运......
  • python---字典遍历
    1、三种常见的字典遍历实现defget_key_value(dics):  '''遍历所有键值对'''  forkey,valueindics.items():    print(f"{key}:{value}")defget_keys(dics):  '''遍历所有的键'''  forkeyindics......