如何使用opencv检测大量白色像素的区域?

时间:2012-04-21 20:14:02

标签: c++ image-processing opencv object-detection

我想检测图像中的徽标以便将其删除,我有一个想法是寻找具有大量像素然后移除的对象,另一个想法是遍历所有白色像素(我已经倒置了我的图像)并寻找形成一个大区域的像素,然后删除这个区域,是否有任何算法比这个更好,opencv中的哪些方法将帮助我检测大像素数的对象。

2 个答案:

答案 0 :(得分:34)

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

下面是代码(在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:

detected contour drawn on the input image

Next is the mask image:

New mask image

现在使用cv2.bitwise_not函数反转图像。在那里你可以选择给我们提供掩模图像的掩模,这样功能只能在输入图像中掩模图像中有白色的区域运行。

cv2.bitwise_not(gray2,gray2,mask)

最后展示图片:

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

结果如下:

enter image description here


注意:

完成上述方法以将“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()

结果:

检测到边界值:

enter image description here

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

enter image description here

这比以前更好,当然如果你不想要“ORANGE”)

答案 1 :(得分:1)

您可以使用形态滤镜(可能是交替顺序滤镜)来简化多色图像,然后使用像分水岭或某种粒度法一样的分割算法,并选择最大的对象。您可以在线找到几种实现方式。但这只有在徽标是离散的时候才有效(例如不在背景上)