2016-11-13 7 views
0

Image to be Processed Я пытаюсь разработать плагин автоматической калибровки, для которого мне нужно среднее значение значения пикселя центральной капли на изображении. На данный момент я конвертирую это изображение в двоичный файл и способен идентифицировать различные капли в изображении.Автоматический выбор площади квадратной пятнистости из изображения: Компьютерное зрение

Но, я хочу, чтобы центральное пятно было идентифицировано каким-то образом. Возможно, мы сможем справиться с окружающими 6 маленькими каплями.

Исходное изображение: https://drive.google.com/open?id=0B9kvfpiOcM1EWnhJeGtBZ3A4eTg

Matlab код:

I = imread('BLOB.TIF'); 
Ibw = ~im2bw(I, 0.75); 
Ifill = imfill(Ibw,'holes'); 
Iarea = bwareaopen(Ifill, 500); 

stat = regionprops(Ifinal,'boundingbox'); 
imshow(I); hold on; 
for cnt = 1 : numel(stat) 
    bb = stat(cnt).BoundingBox; 
    rectangle('position',bb,'edgecolor','r','linewidth',2); 
end 

ответ

0

Ваши результаты очень близки. После выполнения преобразования в двоичные, пороговую и выполнение отверстия области, вы получите это изображение:

enter image description here

Есть пиксели вдоль границ пикселей, которые все еще вокруг. Вы можете использовать функцию imclearborder, чтобы удалить пиксели, которые касаются границы. Чтобы быть абсолютно уверенным, используйте 8-связность, чтобы он искал пиксели во всех 8 направлениях. По умолчанию использовать 4-связанность, которая Север, Юг, Восток и Запад только:

Iclear = imclearborder(Iarea, 8); 

Теперь мы получаем этот образ:

enter image description here

Мы почти закончили. Вы хотите, чтобы весь blob был обнаружен, а не только разные части блоба. То, что я рекомендовал бы вам, это заполнить все пробелы, используя оператор морфологического закрытия. Используйте элемент структуры, который достаточно велик, чтобы обеспечить заполнение пробелов. Что-то вроде элемента квадратной структуры размером 50 x 50 должно работать. Используйте imclose в сочетании с strel указать элемент структуры:

se = strel('square', 50); 
out = imclose(Iclear, se); 

Теперь мы получаем:

enter image description here

Теперь мы можем использовать вышеупомянутое изображение в качестве маски, чтобы маскировать все изображения, кроме для вашего блога интереса, умножая маску и изображение вместе. Вы также можете использовать маску для непосредственного индексации изображения и установки пикселей, не принадлежащих маске, равной 0. Давайте выберем вторую опцию. Сначала сделайте копию изображения, а затем сделать индексацию:

filt = I; 
filt(~out) = 0; 
imshow(filt); 

Сейчас мы получаем:

enter image description here

Не совершенным, но это хорошее начало. Возможно, вам придется немного настроить параметры, чтобы улучшить их.

Удачи вам!

0

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

В моем ответе, например, предполагается, что наиболее четко определенная горизонтальная линия в любых таких изображениях, которые вы берете, будет находиться на объекте, который вы там разместили, либо в виде тени сверху, либо в линии между фоном объекта и большим квадрат. Он также предполагает, что верхняя линия центрального квадрата будет второй по длине непрерывной горизонтальной линией, которую вы найдете на изображении (кроме нижней границы объекта и нижней линии большого квадрата). Наконец, я предполагаю, что перспектива не изменится слишком сильно.

Часто используйте imagesc() после каждого шага, чтобы понять, что происходит, иначе этот ответ займет 50 страниц.

% Normalize Image 
image = double(BLOB); 
image = (image - min(image(:)))*255/(max(image(:))-min(image(:))); 

% Find Strong Horizontal Lines 
Gy = imfilter(image,[-1 0 1]','replicate'); 
HH = abs(Gy)>prctile(abs(Gy(:)),95); 

% Find the 10 Largest Lines 
CC = bwconncomp(HH); 
LengthList=sort(cellfun(@length,CC.PixelIdxList)','descend'); 
Lines = bwareaopen(HH,LengthList(10)); 
CC2 = bwconncomp(Lines); 

Это линии:

Need Reputation to Put Images...


% Get Coordinates of Every Point in the 10 Largest Lines 
[y x] = cellfun(@(X) ind2sub(size(Lines),X) ,CC2.PixelIdxList,'UniformOutput',false); 

% Find Descriptive Parameters of Each Line 
minx = cell2mat(cellfun(@min ,x,'UniformOutput',false))'; 
maxx = cell2mat(cellfun(@max ,x,'UniformOutput',false))'; 
miny = cell2mat(cellfun(@min ,y,'UniformOutput',false))'; 
maxy = cell2mat(cellfun(@max ,y,'UniformOutput',false))'; 
meanx = mean([minx maxx],2); 

% Find the Horizontal Length of Each Line 
LineLengths = maxx-minx; 

% Find the Pair of 2 Second Largest Lines - The Top and Bottom Border of 
% the Square 
SecondLongestLineUpperBound = max(LineLengths)-0.2*max(LineLengths); 
SecondLongestLineLowerBound = max(LineLengths)/3; 
SquareBorderIndx = find(LineLengths>=SecondLongestLineLowerBound & LineLengths<=SecondLongestLineUpperBound); 

% Make Sure First of the Pair is the Lower Line 
[~,OrderedIndx] = sort(maxy(SquareBorderIndx)); 
SquareBorderIndx = SquareBorderIndx(OrderedIndx); 

% Draw a Small Rectangle in the ROI and Get the ROI 
DD =zeros(size(Lines)); 
DD(maxy(SquareBorderIndx(1)):miny(SquareBorderIndx(2)),meanx(SquareBorderIndx(1))-LineLengths(SquareBorderIndx(1))/5:meanx(SquareBorderIndx(2))+LineLengths(SquareBorderIndx(2))/5)=1; 
ROI = double(BLOB).*DD; 

Это ROI:

Need Reputation to Put Images...


% Find Mean Intensity In the ROI 
Result = mean(ROI(ROI(:)>0)); 

Result = 

    4.3598e+04 

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

  • Нет связанных вопросов^_^