2012-04-21 323 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

相關問題