互动从图像中提取像素以及自定义线

59视图(30天)
下面的代码提取第一列图像的像素值。
IMt = imread (“test.jpg”);
%转换为双格式
IMtd =双(IMt);
%隔离第一次跟踪
跟踪= (IMtd (: 1));
我需要做的是沿着任意线提取像素值(见下面图片中红线)。换句话说,沿着一个方向斜行和列。
有一个可用的工具Matlab可以画出一个图像,然后交互式地画一条线在提取的值?
如果我用……
imshow (IMt)
datacursormode
…像素值交互显示当我举起的形象。就需要有一种方法编写成一个数组在同一时间。

接受的答案

图像分析
图像分析 2020年6月6日
尝试improfile ()
或画直线()和一个回调函数
5个评论
Z.S.
Z.S. 2021年7月2日
我认为这个变量 linestart lineend 是7月结束的x和y坐标点使用 improfile 。的帮助页面 improfile 格式应该是 improfile (I (x, y)。 然后代码应该类似:
我= imread (“liftingbody.png”);
imshow(我);
投资回报率=画直线(“颜色”,“r”);
%现在交互式地画一条线
%
%的X和Y坐标读出的开始和结束点
line_xs = [roi.Position (1, 1), roi.Position (2, 1))
line_ys = [roi.Position (1、2), roi.Position (2, 2)];
沿着线%提取像素值
pixvals = improfile(我line_xs line_ys);
情节(pixvals 1:长度(pixvals),“k”),轴、标题(的像素值)
包含(的像素灰度值)
ylabel (的相对位置linestart (0) lineend”)

登录置评。

答案(1)

杰夫·马瑟
杰夫·马瑟 2020年6月8日
我一直在思考如何帧功能的增强请求你要求,我有一些问题。
我很想知道你的最终目标是什么,到底你想发生沿对角线。
假设您有一个对角线,通过像素只是一个小小的十字架,一点点,它要统计吗?或者它将适当确定行和列的数量diagnol张成,然后使用 函数的 找出像素样本的数量一致。(你现在就可以做 improfile 现在,当然,对于非交互式语法)。
所有这些让我第一个问题:什么是你的终极目标有improfile返回更多的像素网站吗?你将如何使用,增加决议?
(顺便说一句,我不是批评你的要求,我只是想确保我们得到一个解决方案,满足您的用例)。
1评论
弗洛里安
弗洛里安 2020年6月8日
编辑:弗洛里安 2020年6月8日
嗨,杰夫,
谢谢你的联系。让我们回到我的第一个评论日期为7 2020年6月20。我的观点是首先试试如果improfile读取像素画线作为一个期望的图像数据。
我展示的示例中(见我的附加文件的评论通过滚动到右边),我画了一条直线liftingbody的从上到下。png图像的大小是512 x 512像素。正如你所看到的从左边的工作空间变量的附加文件,画线的开始和结束点都恰逢列249的图像。在这种情况下我就想到improfile返回512值每一列的长度。相反,improfile只返回265个值在工作区(pixvals变量)。所以这第一个例子告诉我,有一个问题阅读沿着直线的像素值。当你去的我的附加文件然后Matlab图2显示了在画线中提取灰度值。第一个100值对应于灰色区间上的飞行物,而之后的对应对象本身(在200年代价值观匹配的白色颜色飞对象)。请注意,没有灰度值属于下面的灰色区间飞行物。所以这是我担心:像素值的捕捉就停止在画线,不继续的图像按照画线。
也许有一些错误在我的评估,但对我来说似乎improfile函数不返回正确的值在画线。的第一件事就是来验证,如果我的两个观测解释上面是正确的,因此需要有一个进步improfile函数。
第二步将看对角线,然后如果我说对角线我希望improfile retun像素的数量接近实际数量的像素,分析师在这段代码中定义的图像
numSamples =圆(√(linestart (1) - lineend (1))。^ 2 + (linestart (2)——lineend (2)) ^ 2))。
pixvals = improfile(我linestart lineend numSamples);
所以使用一个完整的对角线的512 x 512像素图像,这将达724像素值。和取样同样采样的像素画线,不是结束1/2或2/3。
亲切的问候,
弗洛里安

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!