https://www.ilovematlab.cn/thread-606019-1-1.html在尝试解决这个问题的时候,我采用的是通过调用matlab中的inpolygon函数,来确定图片中的点是否在轮廓线内部。
当我将轮廓线坐标点提取出来的时候发现轮廓线点的坐标并非按照多边形的轮廓进行排序的,所以后面调用该函数也存在问题。
虽然上面的那个问题得到了解决,在图像工具中,使用既有命令即可解决。但是这个离散无序将其转换成有序的多边形该如何实现呢?
我想到matlab中的计算几何学中的区域边界,调用效果都不理想,求指点。
- clear
- RGB=imread('C:\Users\LJJ\Desktop\123\191311lzkkks8klkm5bl6s.png');%上传的第一幅图片
- I = rgb2gray(im2single(RGB));
- % subplot(121)
- % imshow(I)
- nrows = size(RGB,1);
- ncols = size(RGB,2);
- [X,Y] = meshgrid(1:ncols,nrows:-1:1);
- %获取图像内部点坐标
- xx=X(I==0);
- yy=Y(I==0);
- %% 找出内部的两个轮廓线
- % 内部不规则形状的轮廓
- in = inpolygon(xx,yy,[90,480,480,90],[50,50,400,400]);
- x_in1=xx(in);
- y_in1=yy(in);
- %内部较粗的矩形轮廓
- % x_in2=xx(~in);
- % y_in2=yy(~in);
- %绘图验证
- figure
- subplot(121)
- plot(x_in1,y_in1,'r.')
- subplot(122)
- plot(x_in1,y_in1,'r.--')
- %% 计算几何中的边界区域alphaShape,boundary,convhull效果都不理想
- figure
- shp = alphaShape(x_in1,y_in1);
- plot(shp)
- k = boundary(x_in1,y_in1,0.99);
- k1 = convhull(x_in1,y_in1);
- hold on;
- plot(x_in1(k),y_in1(k),'r.-');
- plot(x_in1(k1),y_in1(k1),'g.-');
- plot(x_in1,y_in1,'b.')
复制代码
需要处理的图片
无序点展示
调用边界后的效果
|