【问题标题】:How can I draw/contour the edges of shapes in an image without false positives?如何在没有误报的情况下绘制/勾勒图像中形状的边缘?
【发布时间】:2021-05-21 19:28:02
【问题描述】:

我正在尝试制作一个脚本,我可以在其中绘制图像中每个形状的轮廓,这在某些情况下有效,但当形状的颜色有些退化时会失败。它旨在绘制形状的轮廓(在这种情况下为矩形),但无法绘制整个矩形,并且还在内部添加了一些误报点。有没有一种方法可以降低脚本的敏感性或其他可以帮助我实现这一目标的工具?

from __future__ import print_function
import os
import imutils
import cv2
from PIL import Image
import numpy as np


print("OpenCV Version: {}".format(cv2.__version__))
image = cv2.imread("input.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 225, 255, cv2.THRESH_BINARY_INV)[1]
if imutils.is_cv2() or imutils.is_cv4():
    (cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_NONE)
elif imutils.is_cv3():
    (_, cnts, _) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_NONE)

cv2.drawContours(image, cnts, -1, (50, 50, 50),24)

RGBimage = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
PILimage = Image.fromarray(RGBimage)
PILimage.save('output.png', dpi=(300,300))

【问题讨论】:

  • 你能把原图也贴出来吗?我想试试你的代码。我正在努力学习枕头
  • 不知道 findcontours 是如何工作的,你能以同样的方式变换你的图像,使其只有两种颜色吗? tha docs说轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和对象检测和识别的有用工具。为了获得更好的准确性,请使用二值图像。所以在寻找轮廓之前,应用阈值或精确边缘检测。
  • 更改阈值
  • @lorelayb 您好,使用您的代码和ibb.co/19Hh0kb 作为输入我得到ibb.co/zZkS5TX 作为输出,因此您的代码似乎可以工作。使用您上传的输入将输入图像作为输出返回,不确定它是否与 countur 发现白色超过黑色作为计数有关

标签: python opencv image-processing opencv-contour opencv-drawcontour


【解决方案1】:

更改阈值:

thresh = cv2.threshold(灰色, 250, 255, cv2.THRESH_BINARY_INV)[1]

【讨论】:

  • 谢谢!发现更改阈值实际上是关键,尚不确定计算阈值的最佳方法是什么,但会尝试进行不同的测试,以便我可以更好地了解如何选择在不同场景中工作的值,但希望有所作为大约 250,255 人将继续在不同的场景中工作。
  • 不知道这取决于您拥有的灰色范围,这取决于您拥有的颜色范围。看看这个:在优化 findcounturs 方面很有趣stackoverflow.com/questions/58523157/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多