如何通过matlab中的边缘点绘制图像的平滑边界

时间:2017-05-26 03:36:19

标签: matlab boundary

我有一个分段区域,如图1所示。我想通过连接下边缘点使用matlab绘制下边界,如图2所示。我不能像图2那样绘制。所以我做了一些形态学操作,如填充,加厚,关闭但没有得到plot的想法。你提供了matlab代码。

图1

图2

1 个答案:

答案 0 :(得分:0)

这是一个解决方案

  • 阈值图像因此它只是二进制,因为这个图像很简单
  • 确定每列中最低像素的位置
  • 通过仅取每第n列的最大值来平滑。 如果您只想要最低点,那么您可以在以下代码的第4行停止!

对代码进行了评论以获取更多详细信息:

img = rgb2gray(imread('1.jpg')); % Read image
img = img > 0.5;                 % Threshold to get binary image
% Get last row where there is a 1 pixel in the image for each column
lastrow = max(repmat((1:size(img,1))', 1, size(img,2)).*img,[],1);
res = 30;                        % Pixel resolution for line averaging
% Ensure res divides num. columns by padding the end of the vector
lastrowpadded = [lastrow, NaN(1, res - mod(numel(lastrow),res))]; 
% Reshape into columns of length 'res', then get the max row number
lastrow2 = max(reshape(lastrowpadded,res,[]),[],1);
% Plots
imshow(img); 
hold on
plot(1:size(img,2), lastrow, '.')
plot(res/2:res:size(lastrowpadded,2)-res/2, lastrow2, 'linewidth', 1.5)
hold off
legend('lowest points', 'smoothed lowest points')

结果:

grouped max

注意:因为图像在左上角用(0,0)绘制,如果您在没有图像的情况下绘制它,则该图将颠倒。从图像的高度中减去lastrow2lastrow值以纠正此问题。

编辑:您可能也会对convhull感兴趣创建凸包

[X,Y] = find(img); % After thresholding image as before, get X,Y coords
K = convhull(X,Y); % Get convex hull indices
imshow(img)        % Show image
hold on    
plot(Y(K),X(K),'linewidth',1.5) % Plot convex hull

结果:

convhull