如果我正确理解了您的问题,您希望计算每行的白色像素总数,我们会将其存储在一个数组中。您拥有的代码几乎可以工作。您正在做的是计算图像中整体白色像素的 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 像素。
这显然对您的阈值和二值化图像的方式非常敏感,但这应该足以让您入门。
祝你好运!