Я написал программу для построения порога из изображения в градациях серого и нахождения его нижнего центра объекта.Это также используется для рисования геометрии (линии) в объекте.Функция cv2.PCACompute()
используется для нахождения центра объекта.После того, как это сделано, я могу нарисовать линии, чтобы соответствовать приблизительной форме объекта и провести дальнейший анализ.
Итак:
Экстремумы объекта - это важная вещь, которую мне нужно найти, а не центр.Но для их расчета мне нужно нарисовать линию, исходящую из центра.Проблема в том, что мне нужно сообщить программе size
объекта.Прямо сейчас я пытаюсь автоматизировать это, обнаруживая экстремумы объекта вместо центра.Интересно, можете ли вы помочь мне с этим?
Входное изображение:
Сначала строится порог, а верхний объект удаляетсяиз него:
import cv2
import numpy as np
#required to draw the length of the lins, originating from the core of object
scale = 20 #factor by which original image was scaled up
shard_size = 12*scale #length of object
#import image
img = cv2.imread('img.png', 0)
#build threshold
_, thresh = cv2.threshold(img,
235,
255,
cv2.THRESH_BINARY)
#remove upper object from image
z = 0
for x in thresh[::-1]:
v = 0
for el in x:
if el > 0:
break
v += 1
z += 1
if el > 0:
thresh[:int(-z-shard_size-2*scale)] = 0
break
Как видите, объект режется сверху.Это неуклюжий способ сделать это.На следующем шаге cv2.PCACompute()
используется для нахождения центра объекта и определения направления его экстремумов.При условии shard_size
можно провести линию в направлении экстремумов объекта.
#compute geometry of object (center + line extrema)
mat = np.argwhere(thresh == 255)
mat[:, [0, 1]] = mat[:, [1, 0]]
mat = np.array(mat).astype(np.float32)
m, e = cv2.PCACompute(mat, mean = np.array([]))
#determine coordinates of object (center + line extrema)
center = tuple(m[0])
endpoint1 = tuple(m[0] - e[0] * shard_size/2)
endpoint2 = tuple(m[0] + e[0] * shard_size/2)
#draw line into object
red_color = (0, 0, 255)
coord1 = endpoint1
coord2 = endpoint2
cv2.circle(img, center, 1, red_color)
cv2.line(img, coord1, coord2, red_color)
#save output img
cv2.imwrite('output_img.png', img)
Как найти экстремумы объекта вместо центра, поэтому мне не нужно давать программе shard_size
Введите больше?