平滑和拟合二值图像的边缘

Smooth and fit edge of binary images

我正在使用视频分析进行有关鱼类游泳的研究,然后我需要仔细处理图像(从视频帧中获得),重点放在尾部。

图像在 High-Resolution 中,我定制的软件使用二进制图像,因为在这上面易于使用数学运算。

为了获得这个二进制图像,我使用了 2 种方法:

1) 将图像转换为灰色,反转颜色,然后转换为黑白,最后转换为二进制,并使用阈值给我这样的图像,几乎没有噪音。图像有时会丢失一些区域并且与尾巴不完全一致(现在我需要更多的准确性来确定尾巴移动的幅度) image 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),因为我不能 post 更多链接,请记住我正在使用迭代,我不能逐帧工作。

注意:如果我问这是因为我处于死角并且我没有资源支付给某人来做这件事,直到这一刻我能够编写代码但是在最后一个问题中我一个人不行。

我认为你应该使用连接组件标记并丢弃小标签,而不是提取标签边界以获得每个部分的像素

代码:

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);

最终图片: