используйте координату осей для создания изображения без его построения в Matlab

#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 я теряю много объектов в исходном изображении!