2012-04-21 327 views
11

我想检测内部图像的徽标,以消除它,我有一个想法是寻找具有大量像素然后删除的对象,另一个想法是循环所有的白色像素(我已倒置我的形象),并寻找形成一个大区域的像素,然后去除这个区域,有没有更好的算法,这个,还有opencv中的哪些方法将帮助我检测大像素数目的对象。如何使用opencv检测大量白色像素的区域?

回答

32

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

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


注:

以上方法是为了在白色方块中保存“橙色”。这就是为什么有些神器出现在那里。如果你不想那个橘子,它可以更准确。

只需找到区域过滤轮廓的边界矩形和填充黑色的绘制矩形。

代码:

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() 

结果:

检测边界rects:

enter image description here

然后fillout与黑色矩形的那些:

enter image description here

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

+0

你为什么调整图像大小? – chostDevil 2012-04-22 10:49:55

+0

这是因为你的图像太大以至于我的屏幕无法将它作为一个整体包含在内。 (这里不是很重要,如果你不喜欢就避免它,'也是小图像意味着更快的操作')顺便说一下,你真正想要的方法是什么?与橙色或没有橙色? – 2012-04-22 10:53:47

+0

如果您知道C++,请更新您的答案,因为我无法在python和C++之间进行映射 – chostDevil 2012-04-22 11:49:33

1

您可以使用形态滤波器(也许交替顺序滤波),以简化您的多彩色图像,然后使用分割算法像分水岭或粒度的一些方法和选择的最大对象。您可能会在网上找到几个实现。但是,只有徽标是离散的(例如不在背景中),这才能起作用。

+0

你是什么意思(不是背景) – chostDevil 2012-04-21 20:34:10

+0

@PatrickJones意味着我的意思是,如果它是一个形象的地方,而不是一个那些徽标在文本下并且占据整个卡片的名片。或者如果卡被分成几个颜色区域。有很多情况。 – sivann 2012-04-21 20:38:18

+0

什么是形态过滤器或交替顺序过滤请讨论 – chostDevil 2012-04-21 20:47:41

相关问题