如何在二值图像中找到目标的端点坐标?

6次浏览(最近30天)
艾玛·墨菲
艾玛·墨菲 2021年4月6日
编辑: 艾玛·墨菲2021年4月8日
亲爱的,
请任何人可以帮助我找到端点坐标在二值图像使用matlab..?
标记的红色点是二值图像中物体的端点…
有可能找到终点的坐标使用matlab..?
谢谢提前

接受的答案

沃尔特·罗伯森
沃尔特·罗伯森 2021年4月7日
需求并没有很好地定义。
我= imread (“//www.tatmou.com/matlabcentral/answers/uploaded_files/574367/image.png”);
bw = im2bw (im);
信息= regionprops (bw,“重心”极值的“定位”);
图像(im);colormap(灰色(256));
持有
K = 1: 3
ti = info (K);
ori = ti.Orientation;
Isflat = abs(ori) <= 45;
如果isflat
离群值(:,:,K) =。极值(8 [4]:);
其他的
离群值(:,:,K) =。极值([1 5]:);
结束
文本(ti.Centroid (1) ti.Centroid(2),字符串(K),“颜色”“r”);
散射(异常值(:1 K),离群值(:,2 K)," b *’);
结束
离群值
离群值=
离群值(:,:,1)= 116.5000 240.5000 168.5000 390.5000离群值(:,:,2)= 185.5000 410.5000 254.5000 580.5000离群值(:,:,3)= 438.5000 337.5000 243.5000 352.5000
1评论
艾玛·墨菲
艾玛·墨菲 2021年4月7日
谢谢您,先生……这对我意味着很多……
感谢您的回复和解决方案....
感谢你…!

登录评论。

更多的答案(3)

图像分析
图像分析 2021年4月7日
有一个简单的方法。只使用bwferet ():
clc;%清除命令窗口。
关闭所有%关闭所有数据(imtool.除外)
清晰;删除所有已存在的变量。或者clearvars,如果你想的话。
工作空间;%确保显示工作区面板。
格式长g
格式紧凑的
字形大小= 20;
%--------------------------------------------------------------------------------------------------------
%读取映像
文件夹= pwd;
baseFileName =“image.png”
grayImage = imread (baseFileName);
%获取图像的尺寸。
对于灰度图像,% numberOfColorChannels = 1,对于RGB彩色图像,% numberOfColorChannels = 3。
[rows, columns, numberOfColorChannels] = size(grayImage)
如果numberOfColorChannels > 1
这并不是我们所期望的那种真正的灰度,而是彩色的。
%使用所有通道的加权和创建灰度图像。
grayImage = min(grayImage, [], 3);
结束
%--------------------------------------------------------------------------------------------------------
%显示图像。
imshow (grayImage []);
轴(“上”“图像”);
标题(灰度图像的“字形大小”字形大小,“翻译”“没有”);
impixelinfo;
hFig = gcf;
hFig。WindowState =“最大化”%可能无法在MATLAB的早期版本中工作。
drawnow;
%转换为二进制图像
mask = grayImage > 128;
获得Feret的直径信息。
feretProperties = bwferet(面具)
%在图像上绘制Feret直径。
持有
k = 1: height(feretProperties)
maxCoordinates = feretProperties.MaxCoordinates {k};
x = maxCoordinates(:, 1);
y = maxCoordinates(:, 2);
情节(x, y,' r . - '“线宽”2,“MarkerSize”, 30);
结束
7评论

登录评论。


KSSV
KSSV 2021年4月6日
我= imread (“image.png”) ;
I1 = rgb2gray(I);
[y,x] = find(I1);
[idx,C] = kmeans([x y],3);
imshow(我)
持有
情节(x (idx = = 1), y (idx = = 1),“r”。
情节(x (idx = = 2), y (idx = = 2),“b”。
情节(x (idx = = 3), y (idx = = 3),“g”。
情节(C (: 1), C (:, 2),‘* k”
7评论
艾玛·墨菲
艾玛·墨菲 2021年4月6日
谢谢你的解决方案,但它给出了所有边界的端点,我只想要标记的红色点的端点坐标…?
我只想要红色标记端点的坐标,而不是所有边界点的坐标…
谢谢你的回复

登录评论。


图像分析
图像分析 2021年4月6日
我要做的是使用regionprops()来查找质心和方向。然后也调用bwboundaries()来获得边界的x、y坐标。然后用polyfit()创建一条通过该角度的质心的线。然后将直线坐标与边界坐标进行比较,找出最接近边界的直线坐标。确保它们之间的距离很远,比如比长轴长度的一半还要远,否则你就会发现在blob的同一端点上有两个点(这是可能的)。这是一个开始
道具= regionprops(面具,“定位”“MajorAxisLength”“重心”);
边界= bwboundaries(面具);
[rows, columns] = size(mask)
K = 1:道具
xy =道具(k) .Centroid;
xc = xy (1);
yc = xy (2);
thisBoundary = {k}边界;
xb = thisBoundary(:, 2);
yb = thisBoundary(:, 1); / /边界
斜率=每股(道具(k) .Orientation);
%方向线通过质心y =斜率* (x - xc) + yc, x =
% 1:列
结束
对不起,我现在就讲这么多了,但我相信剩下的你们会很容易算出来的。
1评论
艾玛·墨菲
艾玛·墨菲 2021年4月6日
谢谢回复....得到边界坐标,但我想要物体的端点,....有可能到……吗?
但没有得到确切的终点,你能告诉我是否有任何微小的改变可以做…?
我试着…
labeledImage = bwlabel (binaryImage);
%了解方向
测量= regionprops (labeledImage, “定位” “MajorAxisLength” “重心” );
allAngles = -[测量。方向)
持有
K = 1:长度(尺寸)
xCenter =测量(k) .Centroid (1);
yCenter =测量(k) .Centroid (2);
%确定端点
axisRadius =测量(k)。MajorAxisLength / 2;
x1 = xCenter + axisRadius * cosd(allAngles(k));
x2 = xCenter -轴径* cosd(allAngles(k));
y1 = yCenter + axisRadius * sind(allAngles(k));
y2 = yCenter -轴径* sind(allAngles(k));
流( ' x1 = %。2f, y1 = %。2f, x2 = %。2f, y2 = %.2f\n\n' , x, y, x, y);
图([x1, x2], [y1, y2]) 的r - “线宽” 2);
结束

登录评论。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!