2013-02-08 5 views
3

Я пытаюсь обнаружить белые точки на следующем изображении с использованием OpenCV и Python.Обнаружение объекта с помощью openCV и python

enter image description here

Я попытался с помощью функции cv2.HoughCircles, но без какого-либо успеха.

Нужно ли использовать другой метод?

Это мой код:

import cv2, cv 
import numpy as np 
import sys 

if len(sys.argv)>1: 
    filename = sys.argv[1] 
else: 
    filename = 'p.png' 

img_gray = cv2.imread(filename,cv2.CV_LOAD_IMAGE_GRAYSCALE) 

if img_gray==None: 
    print "cannot open ",filename 

else: 
    img = cv2.GaussianBlur(img_gray, (0,0), 2) 
    cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 
    circles = cv2.HoughCircles(img,cv2.cv.CV_HOUGH_GRADIENT,4,10,param1=200,param2=100,minRadius=3,maxRadius=100) 
if circles: 
    circles = np.uint16(np.around(circles)) 
    for i in circles[0,:]: 
     cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),1) 
     cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) 

cv2.imshow('detected circles',cimg) 
cv2.waitKey(0) 
cv2.destroyAllWindows() 
+2

Вокруг границы изображения много белых точек. Можете ли вы уточнить, какие точки вы хотите найти? Может быть, те, кто ближе к центру, которые не являются точками? – mmgp

ответ

0

Я думаю, что медианный фильтр улучшит изображение. Попробуйте поэкспериментировать с некоторыми ядрами 3x3 или 7x7. Затем после этого какой-то (локальный) алгоритм порога вы получите формы. Вы можете либо HoughCircles, либо просто найти контуры и проверить их на округлость.

0

Преобразование изображения в двоичное изображение с использованием подходящей пороговой техники (возможно, Otsu). Затем используйте морфологические операции, такие как эрозия, чтобы уменьшить круги, а затем вы можете легко найти их центры.

+0

Otsu даст очень плохой результат здесь, вы можете проверить его самостоятельно или хотя бы взглянуть на гистограмму изображения (подсказка: это унимодальная). – mmgp

+0

да, может быть, вы правы. Я работал над чем-то подобным в прошлом, но я не могу вспомнить, какую бинаризацию я использовал, будь то китлер или otsu. –

+0

Я не прошу вас доверять мне, попробуйте сами. На странице http://i.imgur.com/w0CnlC3.png вы увидите результат после бинаризации Otsu. – mmgp

1

Если вы можете воспроизвести морфологическую реконструкцию в OpenCV, вы можете легко построить h-куполообразное преобразование, которое значительно упростит задачу. В противном случае достаточно простого порога для гауссовской фильтрации.

enter image description here

Binarize[FillingTransform[GaussianFilter[f, 2], 0.4, Padding -> 1]]

гауссовской фильтрации было сделано в коде выше, чтобы эффективно подавлять шум вокруг границы ввода, которое будет оставаться после ч-купола преобразования в противном случае.

Следующий результат является результатом простого порога после гауссовой фильтрации (Binarize[GaussianFilter[f, 2], 0.5]), а также другого результата, который задается прямым бинаризацией с использованием метода порогового значения Kapur (см. Статью «Новый метод для порога изображения на уровне серого с использованием энтропия гистограмме»(которая уже не новый метод, он с 1985 года)):

enter image description hereenter image description here

Правое изображение выше, имеет много мелких точек по всей границе (которая не может быть видно при этом разрешении изображения), но полностью автоматизирован. Из этих 3 вариантов в OpenCV уже присутствует только второй.

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