Использование Matlab 2018.
У меня есть набор изображений, на которых нарисовано большое количество областей интереса.Для изображения также определена битовая маска.Я хочу найти часть (в виде доли или процента) для каждой области интереса, где битовая маска равна 1. Следующий код работает, но довольно медленно.(Занимает ~ 1 минуту для 8 изображений с 80 ROI на изображение).Должен быть более разумный способ сделать это.
Данные приведены в следующем виде: интересующая меня часть изображения лежит между двумя «кольцами».Эти кольца нарисованы вручную.Для каждого из колец регистрируется 80 точек по порядку, идущих по кругу по часовой стрелке.
Данные для внутреннего кольца хранятся как InnerX (n, Im), InnerY (n, Im), где n представляет # точки, а Im является номером изображения (обрабатываются данные для нескольких изображений)в то же время).
OuterX и OuterY похожи.Каждый ROI определяется двумя последовательными точками во внутреннем кольце и двумя соответствующими точками во внешнем кольце.
Score = zeros(size(InnerX));
%Loop over the different images
for i = 1:size(InnerX, 2)
%Loop over all points in this ring
%The points are ordered, so that consecutive points in Inner
%and Outer ring form a ROI
for n = 1:size(InnerX,1)
%if statement to take care of the last point
if(n == size(InnerX, 1))
X = [InnerX(n,i), InnerX(1,i) OuterX(1,i) OuterX(n,i)];
Y = [InnerY(n,i), InnerY(1,i) OuterY(1,i) OuterY(n,i)];
else
X = [InnerX(n,i), InnerX(n+1,i) OuterX(n+1,i) OuterX(n,i)];
Y = [InnerY(n,i), InnerY(n+1,i) OuterY(n+1,i) OuterY(n,i)];
end
%Calculate the integer numbers of the range of all pixels that could
%potentially overlap
xmin = floor(min(X));
ymin = floor(min(Y));
xmax = floor(max(X));
ymax = floor(max(Y));
%Create shape
TotalArea = polyshape(X, Y);
%Loop over all pixels within the range
%For each pixel calculate the overlap with the ROI
%Multiply with the bitmask score for that pixel (0 or 1)
for x = xmin:xmax
for y = ymin:ymax
ROI = polyshape([x x x+1 x+1], [y y+1 y+1 y]);
polyout = intersect(TotalArea, ROI);
Score(n,i) = Score(n,i) + Bitmap(y,x,i) .* polyout.area;
end
end
%Divide by the area of the ROI
Score(n,i) = Score(n,i) / TotalArea.area;
end
end
The results coming out of this seem accurate (correct shape, all numbers between 0 and 1), but as said, this code is rather slow.
Thanks in advance.