如何使用OpenCV检测大量白色像素的区域?
c++
image-processing
object-detection
opencv
4
0

我想检测图像中的徽标以将其删除。我有一个想法是要查找具有大量像素然后删除的对象。另一个想法是遍历所有白色像素(我已经反转了我的图像),寻找形成大区域的像素,然后删除该区域。有没有比这更好的算法了。还有OpenCV中的哪些方法将帮助我检测大像素的对象。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

我有一种方法可以做到这一点。我不知道这种方法是否适用于所有人,但在这里效果很好。

下面是代码(在Python中):

首先将图像转换为灰度,调整图像大小,应用阈值,并制作与调整后的灰度图像大小和类型相同的蒙版图像。 (蒙版图像只是黑色图像)

import cv2
import numpy as np

img = cv2.imread('bus.png')
img = cv2.resize(img,(400,500))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray,127,255,0)
gray2 = gray.copy()
mask = np.zeros(gray.shape,np.uint8)

现在在阈值图像中找到轮廓。过滤轮廓,范围在500到5000之间。它很可能是一个大的白色斑点,显然不是字母。 (请记住,该区域专用于此图像。我不知道您的其他图像。您必须自己找到它)。现在,在填充有白色的蒙版图像上绘制此轮廓。

contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    if 200<cv2.contourArea(cnt)<5000:
        cv2.drawContours(img,[cnt],0,(0,255,0),2)
        cv2.drawContours(mask,[cnt],0,255,-1)

Below is the detected contour image:

检测到在输入图像上绘制的轮廓

Next is the mask image:

新蒙版图片

现在,您可以使用cv2.bitwise_not函数反转图像。您可以在提供蒙版图像的位置提供蒙版选项,以便该功能仅在输入图像中蒙版图像中存在白色的区域上起作用。

cv2.bitwise_not(gray2,gray2,mask)

最后显示图片:

cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果如下:

在此处输入图片说明


注意:

完成上述方法后,将“ ORANGE”保留为白色正方形。这就是为什么有些文物在那里的原因。如果您也不想要那个橙色,它可能会更准确。

只需找到区域过滤轮廓的边界矩形,然后绘制填充黑色的矩形即可。

代码:

import cv2
import numpy as np

img = cv2.imread('bus.png')
img = cv2.resize(img,(400,500))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray,127,255,0)
gray2 = gray.copy()

contours, hier = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    if 200<cv2.contourArea(cnt)<5000:
        (x,y,w,h) = cv2.boundingRect(cnt)
        cv2.rectangle(gray2,(x,y),(x+w,y+h),0,-1)

cv2.imshow('IMG',gray2)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

检测到的边界矩形:

在此处输入图片说明

然后用黑色填充这些矩形:

在此处输入图片说明

如果您不想使用“ ORANGE”,它比以前的要好)

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号