Как я могу использовать маркеры, чтобы применить дистанционное преобразование к изображению? - PullRequest
0 голосов
/ 13 октября 2018

У меня есть изображение, которое на самом деле представляет собой две соединенные ячейки, которые я хочу разделить, применяя дистанционное преобразование.Проблема в том, что картинка имеет более двух пиков, и в результате полученное изображение не является правильным.

Что я на самом деле делаю, так это применяю двоичный порог Оцу для получения черно-белого изображения и принимаю черно-белое изображение в качестве входа для применения преобразования расстояния.Проблема в том, что у меня более двух локальных максимумов, поэтому я хочу использовать 2 маркера, чтобы просто разделить две ячейки (большие круги).Я не могу найти адекватную информацию по использованию маркеров, так кто-нибудь знает, как я могу это сделать?Спасибо априори!

Вот код, который я использую

import numpy as np
import cv2
from skimage.morphology import watershed
from skimage.feature import peak_local_max
import matplotlib.pyplot as plt
from scipy import ndimage

img = cv2.imread('C:\\Users\\Hex\\Desktop\\praktiki\\images1.jpg')


#split the bgr images to single planes
b,g,r = cv2.split(img)
rgb_img = cv2.merge([r,g,b])

#turn color image to gray image in order to threshold
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#threshold obtained through otsu s algorithm, maxval=255(white)
#convert everything that is brighter than threshold to black everything else is converted to white
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)




# Now we want to separate the two objects in image
# Generate the markers as local maxima of the distance
# to the background
distance = ndimage.distance_transform_edt(thresh)
local_maxi = peak_local_max(distance, indices=False, footprint=np.ones((3, 3)),labels=thresh)
markers = ndimage.label(local_maxi)[0]
labels = watershed(-distance, markers, mask=thresh)

plt.figure(figsize=(9, 3.5))
plt.subplot(141)
plt.imshow(rgb_img, cmap='gray', interpolation='nearest')
plt.axis('off')
plt.subplot(142)
plt.imshow(-distance, interpolation='nearest')
plt.axis('off')
plt.subplot(143)
plt.imshow(labels, cmap='Spectral_r', interpolation='nearest')
plt.axis('off')

plt.subplots_adjust(hspace=0.01, wspace=0.01, top=1, bottom=0, left=0,
                    right=1)



plt.show()

, и вот результат, который я беру

Где слева оригинальное изображениев центре расположено преобразование расстояния, а справа - разделенное изображение.

...