Сглаживание и подгонка края двоичных изображений

Я работаю над исследованием плавания рыб, используя анализ видео, затем мне нужно быть осторожным с изображениями (полученными из видеокадров) с акцентом на хвосте.

Изображения находятся в высоком разрешении, а программное обеспечение, которое я настраиваю, работает с двоичными изображениями, потому что с ними легко использовать математические операции.

Для получения этого бинарного изображения я использую 2 метода:

1) Преобразуйте изображение в серое, инвертируйте цвета, затем в bw и, наконец, в двоичное с порогом, который дает мне такие изображения, практически без шума. Изображения иногда теряют немного площади и не очень точно с хвостом (теперь мне нужно больше точности для определения амплитуды движений хвоста) изображение 1

2) я использую этот код, чтобы обрезать границу, которая увеличивает порог, это дает мне хорошее изображение края, но я не знаю, как соединить эти точки и сгладить изображение, или подгонять двоичные изображения, аппроксимацию приложения matlab 2012Rb не дает мне хороший график, и у меня нет доступа к наборам инструментов Matlab.

s4 = imread('arecorte.bmp');
A=[90 90 1110 550]
s5=imcrop(s4,A)
E = edge(s5,'canny',0.59);

image2

Мой вопрос в том, что

Как я могу вписать двоичное изображение или соединить точки и сгладить, не беспокоя хвост?

Или как я могу использовать край изображения 2, чтобы увеличить точность изображения 1?

Я буду загружать изображение в комментариях, которые дают мне представление о методе 2), потому что я не могу публиковать больше ссылок, пожалуйста, помните, что я работаю с итерациями, и я не могу работать кадр за кадром.

Примечание: если я спрашиваю об этом, потому что я нахожусь в мертвой точке, и у меня нет ресурсов, чтобы заплатить кому-то за это, до этого момента я был в состоянии написать код, но в этой последней проблеме я не могу в одиночку,

1 ответ

Решение

Я думаю, что вы должны использовать маркировку подключенных компонентов и отбросить маленькие метки, а затем извлечь границу меток, чтобы получить пиксели каждой части

код:

clear all

% Read image
I = imread('fish.jpg');

% You don't need to do it you haef allready a bw image
Ibw = rgb2gray(I); 
Ibw(Ibw < 100) = 0;

% Find size of image
[row,col] = size(Ibw);

% Find connceted components
CC = bwconncomp(Ibw,8);

% Find area of the compoennts
stats = regionprops(CC,'Area','PixelIdxList');
areas = [stats.Area];

% Sort the areas
[val,index] = sort(areas,'descend');

% Take the two largest comonents ids and create filterd image
IbwFilterd = zeros(row,col);
IbwFilterd(stats(index(1,1)).PixelIdxList) = 1;
IbwFilterd(stats(index(1,2)).PixelIdxList) = 1;
imshow(IbwFilterd);

% Find the pixels of the border of the main component and tail
boundries = bwboundaries(IbwFilterd);

yCorrdainteOfMainFishBody = boundries{1}(:,1);
xCorrdainteOfMainFishBody = boundries{1}(:,2);
linearCorrdMainFishBody = sub2ind([row,col],yCorrdainteOfMainFishBody,xCorrdainteOfMainFishBody);

yCorrdainteOfTailFishBody = boundries{2}(:,1);
xCorrdainteOfTailFishBody = boundries{2}(:,2);
linearCorrdTailFishBody = sub2ind([row,col],yCorrdainteOfTailFishBody,xCorrdainteOfTailFishBody);

% For visoulaztion put color for the boundries
IFinal = zeros(row,col,3);
IFinalChannel = zeros(row,col);

IFinal(:,:,1) = IFinalChannel;

IFinalChannel(linearCorrdMainFishBody) = 255;
IFinal(:,:,2) = IFinalChannel;

IFinalChannel = zeros(row,col);
IFinalChannel(linearCorrdTailFishBody) = 125;
IFinal(:,:,3) = IFinalChannel;
imshow(IFinal);

Окончательное изображение:

Другие вопросы по тегам