2017-01-03 4 views
1

Необходимо определить красный цвет изображения и получить координаты на основе размера экрана.Блокировка фильтра с использованием opencv в python

  • Использование маски принес часть изображения, имеющего красного цвета
  • превратил его в BW
  • Прикладных гауссовского фильтра к нему.

Окончательное изображение имеет небольшие тела, которые мне нужно удалить и получить координаты остального. Я попробовал SimpleBlobDetector, но не помог. Это мой код -

import cv2 
import numpy as np 
from PIL import Image 

img=cv2.imread("D:\Ankur\Free\line.png") 
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 


lower_red = np.array([0,50,50]) 
upper_red = np.array([10,255,255]) 
mask0 = cv2.inRange(img_hsv, lower_red, upper_red) 


lower_red = np.array([170,50,50]) 
upper_red = np.array([180,255,255]) 
mask1 = cv2.inRange(img_hsv, lower_red, upper_red) 


mask = mask0+mask1 


output_img = img.copy() 
output_img[np.where(mask==0)] = 0 


gray = cv2.cvtColor(output_img, cv2.COLOR_BGR2GRAY) 

#Adaptive Gaussian Thresholding 
gray = cv2.medianBlur(gray,5) 
th3 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) 
cv2.imshow("images", th3) 
#cv2.ims 
cv2.waitKey(0) 

Это изображение я использую и финальное изображение -

Исходное изображение:

enter image description here

после гауссова фильтра

enter image description here

+0

Почему бы не попробовать найти контуры? Найдите контуры и отклоните меньшие по площади или периметру и сохраните более крупные. Затем нарисуйте прямоугольник вокруг остальных больших контуров, получив координаты. –

ответ

0

Если вы работаете над OpenCV 3.0, я бы предложил вам посмотреть на функцию connectedComponentsWithStats.

Else, нижний снипп очищает изображение с открытием и закрытием, затем находит контуры. Затем он рисует контуры и контурные центры.

# Create a kernel 
kernel = np.ones((7,7),np.uint8) 
# Use opening to fill the blobs 
opened = cv2.morphologyEx(th3, cv2.MORPH_OPEN, kernel) 
# Use closing to disconnect the bridges 
closed = cv2.morphologyEx(opened, cv2.MORPH_CLOSE, kernel) 

# Create a color image to show the result 
new_img = cv2.cvtColor(closed, cv2.COLOR_GRAY2BGR) 
# Invert the image 
closed=255-closed 
# Find contours 
contours, hierarchy = cv2.findContours(closed, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 

for cnt in contours: 
    # Skip if the contour area is small 
    area = cv2.contourArea(cnt) 
    if area < 500: 
     continue 
    # Draw the contour 
    cv2.drawContours(new_img, [cnt], -1, (0, 255, 0), 2) 
    # Find the center 
    M = cv2.moments(cnt) 
    cX = int(M["m10"]/M["m00"]) 
    cY = int(M["m01"]/M["m00"]) 
    # Draw the center 
    cv2.circle(new_img, (cX, cY), 7, (0, 0, 255), -1) 

cv2.imwrite("result.png",new_img) 

Я получил следующий результат, надеюсь, что это было то, что вы описывали, и надеемся, что это сработает и для вас.

enter image description here

+0

Я получаю следующую ошибку: ValueError: слишком много значений для распаковки для получения контуров –

+0

findContours реализуется в разных версиях OpenCV. Поскольку я не знаю вашу версию, это было неправильно. Вместо этого попробуйте '_, контуры, иерархию = cv2.findContours (...)'. – ilke444

+0

thnx это сработало ... У меня был opencv 3.0 ... но так как вы предложили connectedComponentsWithStats помеченные области, но не на линии. Но это помогло. Большое спасибо. –

Смежные вопросы