2016-10-19 4 views
0

У меня есть похожие изображения с аналогичным фоновым шумом. Используя OpenCV, существует способ обнаружения области (обнаружения контуров) области, охватывающей метку. Или, по крайней мере, можно определить «грубую» ограничительную рамку, охватывающую область этикеток?OpenCV: Обнаружение ограничивающей рамки, покрывающей этикетку

enter image description here

+2

Что об использовании более высокого порога, а затем найти большой подключенный компонент?. –

+1

Не могли бы вы прояснить ситуацию, вы хотите найти похожие ярлыки на разных фотографиях? или вы хотите просто выбрать ярлык сам и удалить фон? –

+0

Я хочу выбрать ярлык и удалить фон. Как только я извлечу область, содержащую метку, я могу запустить ее с помощью SURF/SIFT, чтобы найти подобное изображение. У меня уже есть вторая часть, это просто с фоновым шумом, мой хит-рейтинг слишком низкий –

ответ

2

Я пытался решить эту задачу, главный вопрос, который, вероятно, не позволит обобщить этот алгоритм, как выбрать правильный контур. У меня есть два значения (длины контура) 3108 и 2855. Вы можете попытаться получить все ваши фотографии (если они находятся на таком же расстоянии от камеры) и установить порог для желаемого контура между 3050 и 2750, но не гарантируют, что он будет работать. Так что это, как я удалить фон (полный код):

import cv2 
import numpy as np 


image=cv2.imread('C:/Users/srlatch/Desktop/of8cA.png') 
img = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) 

def clear_vertical(img, target): 
    for i in range(img.shape[1]): 
     for j in range(img.shape[0]): 
      if img[j][i]: 
       break 
      else: 
       target[j][i]=[0,0,0] 

def clear_horizontal(img, target): 
    for i in range(img.shape[0]): 
     for j in range(img.shape[1]): 
      if img[i][j]: 
       break 
      else: 
       target[i][j]=[0,0,0] 



def turn_off(img): 
    for i in range(img.shape[0]): 
     for j in range(img.shape[1]): 
      img[i][j]=0 

def turn_on(img,result): 
    for i in result: 
     img[i[0][1]][i[0][0]]=255 


def f(list): 
    max=[] 
    for i in list: 
     if len(i)>len(max): 
      max=i 
    return max 

def rem(ls, thresh): 
    new_c=[] 
    for i in ls: 
     if len(i)>thresh: 
      new_c.append(i) 
    return new_c 

def rn(ls,min,max): 
    ret=[] 
    for i in ls: 
     if len(i)<max and len(i)>min: 
      print(len(i)) 
      ret.append(i) 
    return ret 

#ret,tresh = cv2.threshold(img,40,255,cv2.THRESH_BINARY) 
kernel = np.ones((2,2),np.uint8) 
new=cv2.Canny(img,190,1) 
dilated=cv2.dilate(new, kernel) 
tresh,c,hr=cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) 
c=rn(c, 2600, 4000) 
turn_off(new) 
turn_on(new,c[0]) 

clear_horizontal(new,image) 
clear_vertical(new,image) 

cv2.imwrite('result_image_end.png',image) 

cv2.imshow('wnd',image) 
cv2.waitKey(100) 

Я пробовал различные подходы, но это, кажется, работает лучше, чем другие. Я считаю, что в opencv есть функция, которая может заменить это clear_horizontally и vertically, но я не могу запомнить это имя. Надеюсь, поможет! enter image description here

enter image description here