У меня есть небольшая проблема с проектом, над которым я сейчас работаю. Я успешно использовал преобразование расстояния (cv2.distanceTransform
) на изображении. Теперь мне нужно получить яркую «линию» внутри контура (место, наиболее удаленное от контуров). У меня уже есть алгоритм, который делает это, но в результате есть некоторые ошибки, которые я хотел бы исправить. Пока не знаю как. Я использую python, opencv и PyCharm.
Расстояние изображения:
Я пробовал несколько форм порога, хитрый и грубый (который не работает на изогнутых линиях, я думаю). Ни одна работа для моих нужд.
Мой текущий код работает так. Я строю интервал, где я ищу пиксели с наибольшим значением. Значение этих пикселей установлено в 255. Я прохожу изображение дважды. Один раз начиная со строк и один раз начиная со столбцов. К сожалению, при таком подходе получаются пиксели, которые не принадлежат линии. Причина этого, конечно, в том, что используемые интервалы рассчитываются либо по строкам, либо по столбцам.
Результат:
Как вы можете видеть, это не последняя линия через контур. Это изображение я позже буду использовать в качестве маски для построения гистограммы.
def maxValueinIntervall(pathname, bounds, rowMax, colMax):
img = cv2.imread(pathname, 0)
res = np.zeros(img.shape, img.dtype)
maxValue = 0
kernel = np.ones((5, 5), np.uint8)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if(img[i, j] == bounds and img[i, j + 1] > bounds and img[i, j - 1] <= bounds):
n = 1
k = j
myList = []
while(img[i, k + n ] > bounds):
myList.append(img[i, k + n])
k = n + k
maxValue = max(myList)
if (maxValue > rowMax and img[i, j] == maxValue):
res[i, j] = 255
for j in range(img.shape[1]):
for i in range(img.shape[0]):
if(img[i, j] == bounds and img[i + 1, j] > bounds and img[i - 1, j] <= bounds):
n = 1
k = i
myList = []
while(img[k + n, j] > bounds):
myList.append(img[k + n, j])
k = n + k
maxValue = max(myList)
if (maxValue > colMax and img[i, j] == maxValue):
res[i, j] = 255
return res
Может быть, уже есть функция opencv, которая делает это, чего я не нашел. Я надеюсь улучшить свое решение, чтобы получить лучшую маску для моего следующего шага.
Спасибо за ваше время.