Я хочу измерить округлость окружностей (разность "высоты", "ширина" или "эллипс" параметров). Круги даны на фотографиях, как показано здесь:
После обычных вещей, таких как color2gray, пороговое и пограничное обнаружение, я получаю следующее изображение, как показано:
С этим я уже пробовал много разных вещей:
- Элемент списка Watershed с findContour (аналогично этот вопрос) → openCV обнаруживает пространство между кругами как замкнутый контур, а не круги, поскольку они склеиваются не образуя замкнутый контур
- та же проблема с fitEllipse. Я получаю эллипсы, установленные на контуре черного фона, а не между ними.
- просто пытается применить преобразование hough (как в коде и третьем показанном рисунке), а приводит к странным результатам:
Смотрите код здесь:
import sys
import cv2
import numpy
from scipy.ndimage import label
# Application entry point
#img = cv2.imread("02_adj_grey.jpg")
img = cv2.imread("fuss02.jpg")
# Pre-processing.
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("SO_0_gray.png", img_gray)
#_, img_bin = cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
_, img_bin = cv2.threshold(img_gray, 170, 255, cv2.THRESH_BINARY)
cv2.imwrite("SO_1_threshold.png", img_bin)
#blur = cv2.GaussianBlur(img,(5,5),0)
img_bin = cv2.morphologyEx(img_bin, cv2.MORPH_CLOSE, numpy.ones((3, 3), dtype=int))
cv2.imwrite("SO_2_img_bin_morphoEx.png", img_bin)
border = img_bin - cv2.erode(img_bin, None)
cv2.imwrite("SO_3_border.png", border)
circles = cv2.HoughCircles(border,cv2.cv.CV_HOUGH_GRADIENT,50,80, param1=80,param2=40,minRadius=10,maxRadius=150)
print circles
cimg = img
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.putText(cimg,str(i[0])+str(',')+str(i[1]), (i[0],i[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 255)
cv2.imwrite("SO_8_cimg.png", cimg)
Есть ли у кого-то идея улучшить мой алгоритм или совершенно другой подход? Я пробовал много разных подходов, но пока не повезло. Спасибо всем за вашу помощь.