#image #matlab #pixel #axes #coordinate
#изображение #matlab #пиксель #оси #координата
Вопрос:
У меня есть изображение, полное объектов в форме эллипса. Мне нужно спроектировать эллипс для каждого объекта, который наилучшим образом подходит для самого объекта. Я нашел код, который помогает мне отображать эллипсы на изображении здесь.
Я изменил сохранение последней части x
и y
в 3D-матрице (одно измерение для x
, другое для y
и 3-е для количества объектов). Поскольку этот код находится в for
цикле, я не хочу генерировать эллипсы графика фигуры поверх него, сохранять его и загружать с imread
помощью, чтобы передать его остальной части кода.
Есть ли способ преобразовать эту 3D-матрицу в изображение bw, полное подходящих эллипсов в правильном положении на изображении?
Ответ №1:
Эллипсы рисуются поверх существующего рисунка из-за hold on
инструкции после отображения изображения с помощью imshow
. Итак, вместо этого:
imshow(bw)
hold on
Просто создайте новую фигуру, используя figure
оператор:
figure
[Править]
Хорошо, прежде всего, сохранение (x, y)
дает вам только центры эллипсов. Чтобы нарисовать эллипс, вам также потребуется сохранить его основной / второстепенный размер оси ( a
, b
) и угол его ориентации ( theta
).
Я бы просто повторно использовал цикл, который у вас уже есть, но plot
заменил бы его простой установкой пикселя изображения bw равным 1 для каждой координаты:
% get image dimensions
dim = size(bw);
% preallocate a blank bw image
target = false(dim);
% for each ellipse
for k = 1:length(s)
% this part remains the same:
xbar = s(k).Centroid(1);
ybar = s(k).Centroid(2);
a = s(k).MajorAxisLength/2;
b = s(k).MinorAxisLength/2;
theta = pi*s(k).Orientation/180;
R = [ cos(theta) sin(theta)
-sin(theta) cos(theta)];
xy = [a*cosphi; b*sinphi];
xy = R*xy;
x = xy(1,:) xbar;
y = xy(2,:) ybar;
% ----------
% but replace plot(x,y) with this:
% limit to image dimensions (1:256)
x(x<1) = 1; x(x>dim(1))=dim(1);
y(y<1) = 1; y(y>dim(2))=dim(2);
% set those pixels to 1
target(sub2ind(dim, round(x),round(y))) = 1;
end
imshow(target);
Прямо сейчас есть эллипсы, которые наполовину выходят за границы изображения. Вот почему их координаты x, y должны быть ограничены (1: 256); в противном случае вы получите ошибку out-of-range. Вам все еще нужно переосмыслить, следует ли полностью удалить эти эллипсы или нарисовать частично, как это сделано здесь .
Комментарии:
1. Большое спасибо!!! Но я на самом деле хотел бы исключить как figure, так и imshow (кстати, в моем коде я использую figure(); imagesc(bw) вместо imshow, и это не моя проблема). У меня есть то, что bw в моем случае представляет собой матрицу 1024×1392, где каждый элемент представляет собой пиксели. Код, который я использую из Интернета, фактически генерирует два массива: x и y, длиной 50 элементов (значение каждого элемента является координатой эллипса). Как я могу передать эту информацию в координатах осей в матрицу bw? Моя конечная цель — сделать то, что делает код, на который я ссылался, пропустив часть построения и просто добавив эллипсы к изображению bw
2. @user990253: хорошо, теперь я понял. Я обновил код примером.
3. большое вам спасибо! Это большое улучшение, но все еще в пути! Мне действительно нужно, чтобы периметр эллипса был линией, потому что следующий шаг в моем коде — заполнить периметр! Кстати, я использовал dim (1) как для x, так и для y, чтобы получить суперпозицию исходных фигурных объектов и сгенерированных эллипсов. Из-за ошибки out-of-range я теряю много объектов в исходном изображении!