当前位置: 首页 > 知识库问答 >
问题:

删除OpenCV中未使用的形状

夏侯衡
2023-03-14

我已经用python中的OpenCV进行了形状检测,螺栓和螺母。我拍了一张照片,做了二值化,然后检测边缘。现在,由于灰尘和污垢,白色区域总是颗粒状的。我的检测使用最大的区域作为零件,这非常有效。但我如何才能删除由灰尘造成的数千个对象?简言之:我想将数组中的形状清除为最大的形状,以便进一步处理。

共有1个答案

廖臻
2023-03-14

根据我上面使用Python/OpenCV的评论,这里有一种方法可以做到这一点。

从你的二值图像得到轮廓。然后选择最大的轮廓。然后在黑色背景图像上绘制一个白色填充轮廓,其大小与您输入的掩码大小相同。然后使用numpy将图像中遮罩中黑色的所有内容变黑。

输入:

import cv2
import numpy as np

# load image
img = cv2.imread("coke_bottle2.png")
hh, ww = img.shape[:2]

# convert to gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# threshold using inRange
thresh = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)[1]

# apply morphology closing to fill black holes and smooth outline
# could use opening to remove white spots, but we will use contours
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25,25))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

# get the largest contour
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
big_contour = max(contours, key=cv2.contourArea)

# draw largest contour as white filled on black background as mask
mask = np.zeros((hh,ww), dtype=np.uint8)
cv2.drawContours(mask, [big_contour], 0, 255, -1)

# use mask to black all but largest contour
result = img.copy()
result[mask==0] = (0,0,0)

# write result to disk
cv2.imwrite("coke_bottle2_threshold.png", thresh)
cv2.imwrite("coke_bottle2_mask.png", mask)
cv2.imwrite("coke_bottle2_background_removed.jpg", result)

# display it
cv2.imshow("thresh", thresh)
cv2.imshow("mask", mask)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

阈值图像(包含小的无关白色区域):

蒙版图像(仅填充最大的轮廓):

结果:

 类似资料:
  • 我最近启动了Android Studio IDE来制作我的Android应用程序。我发现Android Studio中删除未使用导入的快捷键不工作(Ctrl+Shift+O) 在Android Studio中做相同操作的快捷键是什么?

  • 我试图创建一个应用程序,用户在其中输入多个边,然后单击按钮,从场景中删除任何当前形状,并生成具有指定边数的形状。 虽然生成形状的逻辑正在工作,但实现似乎不起作用? 任何帮助都非常感谢,谢谢!

  • 是否可以删除对象内部的圆形类型? 比方说 到 我想过滤掉对象中的所有圆形类型。 尝试1: 因为每个对象的名称在子对象中也是相同的。我试图删除它,因为大多数孩子的圆形对象只指向父母。(事实上,我对这部分感到困惑)。这是我试图使用的代码。

  • 问题内容: 从我的java(ant)项目中删除未使用的jar的最简单方法是(tool?)。我们的项目已经变得非常庞大,我们希望进行清理。有几个jar添加到类路径中,但并非全部都用于编译/运行。有没有一种方法可以通过从命令行运行一些实用程序来识别不必要的jar? 注意 :我们不想遵循删除一个或多个jar的繁琐过程,然后编译/运行以测试是否需要这些jar。 问题答案: 这就是我最终做的事情,我在编译时

  • 我有一个艰难的时间与dexGuard使它不删除我访问这种方式的资源: int resourceId=getResources()。getIdentifier(“图片”、“数组”、getActivity()。getPackageName()); 当我执行应用程序时,会出现以下异常: JAVAlang.RuntimeException:无法启动android活动。所容纳之物res.Resources$

  • 本文向大家介绍使用OpenCV检测图像中的矩形,包括了使用OpenCV检测图像中的矩形的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现。 2.我这里使用的OpenCV版本是3.30. 矩形检测 1.得到原始图像之后,代码处理的步骤是: (1)滤波