2016-07-26 1 views
2

У меня есть изображения с фазовой контрастностью, которые необходимо сегментировать. Кажется очень сложным сегментировать их из-за отсутствия контраста между объектами из фона (изображение 1). Я использовал функцию adapthisteq для увеличения видимости ячеек (изображение 2). Есть ли способ улучшить сегментацию ячеек?Улучшение сегментации изображения с низким контрастом

normalImage = imread(fileName); 
channlImage = rgb2gray(normalImage); 
histogramEq = adapthisteq(channlImage,'NumTiles',[50 50],'ClipLimit',0.1); 
saturateInt = imadjust(histogramEq); 
binaryImage = im2bw(saturateInt,graythresh(saturateInt)); 
binaryImage = 1 - binaryImage; 

normalImage - сырец изображения normalImage histogramEq - увеличенная видимость изображение histogramEq binaryImage - преобразованные к двоичным изображениям binaryImage

ответ

1

Прежде чем применить порог, я бы отделить различные модели от фона, используя белый верхняя часть. См. here the result. Тогда вы stretch the histogram.

Затем вы можете применить то, что вы сделали.

+0

Привет, я добавил строку '= tophatImage imtophat (histogramEq, Стрел ('диск', 7))' 'после histogramEq'. Результат очень похож на ваш, но разница в том, что объекты интереса кажутся ярче по сравнению с фоном в вашем. Как вы осветли объекты, представляющие интерес? Что вы подразумеваете под «растяжением гистограммы»? – Senyokbalgul

+0

Моей рекомендацией было применить верхнюю шляпу перед адаптацией, а не после. Верхняя шляпа не чувствительна к изменениям освещенности. Я добавил ссылку о растяжении гистограммы. – FiReTiTi

+0

Он по-видимому не помогает с точной сегментацией. – Senyokbalgul

0

Я хотел бы построить ответ FiReTiTi. У меня есть код ниже и некоторые скриншоты. Я сделал это с помощью OpenCV 3.0.0

import cv2 

x = 'test.jpg' 
img = cv2.imread(x, 1) 
cv2.imshow("img",img) 

#----converting the image to grayscale 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
cv2.imshow('gray', gray) 

enter image description here

#----binarization of image 
ret,thresh = cv2.threshold(gray,250,255,cv2.THRESH_BINARY) 
cv2.imshow("thresh",thresh) 

enter image description here

#----performing adaptive thresholding 
athresh=cv2.adaptiveThreshold(thresh, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) 
cv2.imshow('athresh', athresh) 

enter image description here

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7, 7)) 

#----morphological operation 
closing = cv2.morphologyEx(athresh, cv2.MORPH_CLOSE, kernel) 
cv2.imshow('closing', closing) 

enter image description here

#----masking the obtained result on the grayscale image 
result = cv2.bitwise_and(gray, gray, mask= closing) 
cv2.imshow('result ', result) 

enter image description here

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