Это очень некорректная проблема. И вы, и другой ответ делаете очень конкретные предположения о характере таких изображений, которые вы будете принимать во время автоматической калибровки. И поскольку они не определены явно, мы остаемся с принятием того, что мы считаем разумным.
В моем ответе, например, предполагается, что наиболее четко определенная горизонтальная линия в любых таких изображениях, которые вы берете, будет находиться на объекте, который вы там разместили, либо в виде тени сверху, либо в линии между фоном объекта и большим квадрат. Он также предполагает, что верхняя линия центрального квадрата будет второй по длине непрерывной горизонтальной линией, которую вы найдете на изображении (кроме нижней границы объекта и нижней линии большого квадрата). Наконец, я предполагаю, что перспектива не изменится слишком сильно.
Часто используйте 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