【问题标题】:MATLAB Image AnalysisMATLAB 图像分析
【发布时间】:2014-08-19 08:55:16
【问题描述】:

我想分析一些嵌入橡胶外壳中的电线的图片,并找出电线与边缘之间的距离(附图)。

为了便于计算,我已将图像转换为二进制

为了实现这一点,我计划循环遍历图像,水平分析每一行并检测所有非黑色像素并将它们存储在 1xN 矩阵中。在图像的最后,我想连接这个矩阵,以便它给出每行白色像素数量的直方图,峰值之间的空间(在某个阈值之后)将指示像素间距。

我目前的代码如下,但我的编程能力有限。

my_image =imread('image');
for R=1:n
    for C=1:n
        pixel=my_image(R,C);
        if pixel==1 
            counter=counter+1;
        end
   counter
    end
    counter=0;
end

【问题讨论】:

  • 嗨 - 问题是什么 - 你能解释一下问题是什么以及你目前得到什么样的结果/错误
  • 那么,直线和长线边缘和斜线是电线,你想找到边缘和电线之间的距离吗?我说的对吗?

标签: image matlab image-processing


【解决方案1】:

如果我正确理解了您的问题,您希望计算每行的白色像素总数,我们会将其存储在一个数组中。您拥有的代码几乎可以工作。您正在做的是计算图像中整体白色像素的 total 数量。此代码没有准确描述您想要的行为。

因此,让我们继续正确地执行此操作。在此之后,我们可以提供一个stem 图,我们可以使用 X 轴来索引图像的行号,而 Y 轴可以用于显示图像中看到的白色像素的总数.这几乎是您自己观察的结果,但让我们继续绘制这个:

im = imread('http://i.imgur.com/lc8ESac.png'); %// Read in from your post
imBinary = double(im2bw(im)); %// Just in case - Convert to binary, 
                              %// then make double for sum
histogram = sum(imBinary,2); %// Compute row-wise histograms
stem(1:size(imBinary,1), histogram); %// Plot this histogram
xlabel('Row number');
ylabel('White pixel count');
grid;

从图片中可以看出,这符合您的逻辑。您会看到大约在第 150 到 225 行左右,直方图中出现了尖峰。如果我们取 225 和 150 之间的差异,这将为您提供线的宽度(以像素为单位)。但是,您的逻辑将失败的地方大约在第 300 到 400 行之间。您会看到电线在 倾斜 上。如果您要沿行求和,您将无法以这种方式检测这些线的粗细,因为每行只有几个白色像素。


如果你想忽略这些,那我们当然可以。您可以使用diff 计算元素之间的成对相邻距离。如果任何差异不为零,则意味着我们将检测到变化。我们要做的就是检测任何变化,然后阈值这个差异,以便任何大于某个数字的值,这些都是我们想要保留的值。换句话说,这样做:

diffs = diff([0; histogram]);
threshold = 100; %// Define threshold here as per your request
rows = find(diffs >= threshold)

rows = 

148
217
475

diff 的工作原理是,对于数组 x_i 中的第 ith 元素,diff y_i 的输出是这样的:

y_i = x_{i+1} - x_i

因此,请注意,在diff 调用中,我在直方图的开头添加了一个0,然后再执行diff,因为我们假设第一行完全由零组成,因此计数应该是0. 然后我确定哪些行的像素数为 100 或更多。这是我自己设定的用户自定义阈值。

一旦我们这样做了,我们就可以使用另一个diff 命令来查找导线之间的最终厚度:

thickness = diff(rows)

thickness =

  69
 258

这表示您有一根线的厚度为 69 像素,而之后的下一根线的厚度为 258 像素。

这显然对您的阈值和二值化图像的方式非常敏感,但这应该足以让您入门。


祝你好运!

【讨论】:

  • 感谢您的澄清,这绝对是这个小项目的发展方向。我很难找到一种方法来存储每行中的像素数(最初想将其存储在 1xN 数组中),但这也非常有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2017-04-20
  • 2017-11-16
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多