Есть ли какая-либо функция, противоположная bwmorph (image, 'skel') в коде MATLAB или C, C ++? - PullRequest
2 голосов
/ 04 октября 2011

Я хочу создать изображение объекта из его морфологического скелета.Есть ли какая-либо функция в коде MATLAB или C, C ++?Заранее спасибо.

Исходное изображение и его скелет (полученный с использованием bwmorph(image,'skel',Inf)):

hand2 handskel2

Ответы [ 3 ]

6 голосов
/ 06 октября 2011

Как указано в комментариях выше, bwmorph(..,'skel',Inf) дает вам двоичное изображение скелета, которого недостаточно для восстановления исходного изображения.

С другой стороны, если для каждого скелета пикселя были значения, возвращаемые преобразованием расстояния , то вы можете успешно применить обратное преобразование расстояния (как предложено @ belisarius ):

Обратите внимание, что эта реализация InverseDistanceTransform довольно медленная (я основал ее на предыдущем ответе ).Он постоянно использует POLY2MASK , чтобы получить пиксели внутри указанных кругов, поэтому есть место для улучшения ..

%# get binary image
BW = ~imread('http://img546.imageshack.us/img546/3154/hand2.png');

%# SkeletonTransform[]
skel = bwmorph(BW,'skel',Inf);
DD = double(bwdist(~BW));
D = zeros(size(DD));
D(skel) = DD(skel);

%# zero-centered unit circle
t = linspace(0,2*pi,50);
ct = cos(t);
st = sin(t);

%# InverseDistanceTransform[] : union of all disks centered around each
%# pixel of the distance transform, taking pixel values as radius
[r c] = size(D);
BW2 = false(r,c);
for j=1:c
    for i=1:r
        if D(i,j)==0, continue; end
        mask = poly2mask(D(i,j).*st + j, D(i,j).*ct + i, r, c);
        BW2(mask) = true;
    end
end

%# plot
figure
subplot(131), imshow(BW), title('original')
subplot(132), imshow(D,[]), title('Skeleton+DistanceTransform')
subplot(133), imshow(BW2), title('InverseDistanceTransform')

Результат:

original Skeleton_DistanceTransformInverseDistanceTransform

0 голосов
/ 29 августа 2013

Функция bwmorph может использоваться для генерации кода, как показано здесь Функции обработки изображений для генерации кода . Напишите код в функции MATLAB и используйте команду codegen . для генерации кода. Опция для генерации кода доступна после R2012b Замечания по выпуску MATLAB .

0 голосов
/ 04 октября 2011

В зависимости от вашего объекта вы можете получить значимый результат, используя расширение ( IMDILATE в Matlab).

...