如何在matlab中通过边缘点为图像画出光滑的边界
How to draw smooth boundary for the image through the edge points in matlab
我有一个如图 1 所示的分段区域。我想通过连接下边缘点来使用 matlab 绘制下边界,如图 2 所示。我不能像图 2 那样绘制。所以我做了一些形态学诸如填充、加厚、关闭之类的操作,但没有想到 plot.can 您提供了 matlab 代码。
图 1
图 2
这是一个解决方案
- 对图像进行阈值处理,使其只是二进制形式,这很容易,因为该图像很简单
- 确定每列中最低像素的位置
- 只需取每第 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')
结果:
注意:因为图片是用左上角的(0,0)绘制的,如果没有图片绘制的话,这个图会上下颠倒。从图像的高度中减去 lastrow2
或 lastrow
值以纠正此问题。
编辑:您可能还对 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
结果:
我有一个如图 1 所示的分段区域。我想通过连接下边缘点来使用 matlab 绘制下边界,如图 2 所示。我不能像图 2 那样绘制。所以我做了一些形态学诸如填充、加厚、关闭之类的操作,但没有想到 plot.can 您提供了 matlab 代码。
图 1
图 2
这是一个解决方案
- 对图像进行阈值处理,使其只是二进制形式,这很容易,因为该图像很简单
- 确定每列中最低像素的位置
- 只需取每第 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')
结果:
注意:因为图片是用左上角的(0,0)绘制的,如果没有图片绘制的话,这个图会上下颠倒。从图像的高度中减去 lastrow2
或 lastrow
值以纠正此问题。
编辑:您可能还对 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
结果: