Сглаживание и подгонка края двоичных изображений
Я работаю над исследованием плавания рыб, используя анализ видео, затем мне нужно быть осторожным с изображениями (полученными из видеокадров) с акцентом на хвосте.
Изображения находятся в высоком разрешении, а программное обеспечение, которое я настраиваю, работает с двоичными изображениями, потому что с ними легко использовать математические операции.
Для получения этого бинарного изображения я использую 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);
Мой вопрос в том, что
Как я могу вписать двоичное изображение или соединить точки и сгладить, не беспокоя хвост?
Или как я могу использовать край изображения 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);