答案 0 :(得分:18)
如果您有权访问Image Processing Toolbox,则可以利用其中包含的大量过滤和形态操作。以下是使用imfilter
,imclose
和imregionalmax
函数解决问题的一种方法:
% Load and plot the image data:
imageData = imread('lattice_pic.jpg'); % Load the lattice image
subplot(221);
imshow(imageData);
title('Original image');
% Gaussian-filter the image:
gaussFilter = fspecial('gaussian', [31 31], 9); % Create the filter
filteredData = imfilter(imageData, gaussFilter);
subplot(222);
imshow(filteredData);
title('Gaussian-filtered image');
% Perform a morphological close operation:
closeElement = strel('disk', 31); % Create a disk-shaped structuring element
closedData = imclose(filteredData, closeElement);
subplot(223);
imshow(closedData);
title('Closed image');
% Find the regions where local maxima occur:
maxImage = imregionalmax(closedData);
maxImage = imdilate(maxImage, strel('disk', 5)); % Dilate the points to see
% them better on the plot
subplot(224);
imshow(maxImage);
title('Maxima locations');
这是上面代码创建的图像:
为了让事情看起来不错,我只是为高斯滤波器(使用fspecial
创建)和结构元素(使用strel
创建)的参数尝试了几种不同的组合。然而,这一点点的试验和错误给出了一个非常好的结果。
注意:从imregionalmax
返回的图片并不总是只有一个像素设置为1(表示最大值)。输出图像通常包含像素簇,因为输入图像中的相邻像素可以具有相等的值,因此都被计为最大值。在上面的代码中,我还用imdilate
扩展了这些点,只是为了让它们更容易在图像中看到,这使得更大的像素集群以最大值为中心。如果要将像素簇缩小为单个像素,则应删除扩张步骤并以其他方式修改图像(向结果添加噪声或过滤它,然后找到新的最大值等)。
答案 1 :(得分:7)
您可以创建一个滑动窗口(例如10x10像素大小),迭代图像,对于每个位置,您可以计算此10x10字段中的白色像素数,并存储具有最高计数的位置。
整个过程是 O(n * m),其中n是图像的像素数,m是滑动窗口的大小。
换句话说,您convolve使用mean filter(此处为框过滤器)的图像,然后使用极值。
首先,计算一个summed area table,这可以在一次通过中非常有效地完成:
sat
大小相同的二维数组img
。迭代每个索引,并计算每个索引x
和y
sat[x, y] = img[x, y] + sat[x-1, y] + sat[x, y-1] - sat[x-1, y-1]
例如,给定图像,其中0为暗,1为白色,结果为:
img sat
0 0 0 1 0 0 0 0 0 1 1 1
0 0 0 1 0 0 0 0 0 2 2 2
0 1 1 1 0 0 0 1 2 5 5 5
0 1 0 0 0 0 0 2 3 6 6 6
0 0 0 0 0 0 0 2 3 6 6 6
现在用滑动窗口迭代求和区域表的索引,并使用滑动窗口的角A,B,C,D计算其中的白色像素数:
img sat window
0 0 0 1 0 0 0 0 0 1 1 1 0 A-----B 1
0 0 0 1 0 0 0 0 0 2 2 2 0 | 0 2 | 2
0 1 1 1 0 0 0 1 2 5 5 5 0 | 2 5 | 5
0 1 0 0 0 0 0 2 3 6 6 6 0 | 3 6 | 6
0 0 0 0 0 0 0 2 3 6 6 6 0 D-----C 6
计算
density(x', y') = sat(A) + sat(C) - sat(B) - sat(D)
以上示例中的内容是
density(1, 0) = 0 + 6 - 1 - 2 = 3
此过程需要临时图像,但它只是 O(n),因此速度与滑动窗口的大小无关。
答案 2 :(得分:6)
如果你有图像处理工具箱,用高斯滤波器模糊它,然后找到峰值/极值。
改变高斯滤波器的大小以获得所需的“密集”区域的数量。
答案 3 :(得分:4)
也许是一种天真的做法:
您定义一个n * n的正方形,它是您测量密度的区域的最大尺寸。对于图像中的每个点,您将该点视为正方形的中心,并计算黑色(b)和白色(w)点的数量。使用差值b-w,您可以确定哪个方格最白。
必须以模糊的方式确定最密集的区域。如果一个区域有600个白点而另一个区域有599个,那么对于人眼来说,它们的密度是相同的。 600是100%致密的,而599是99%致密的和1%非致密的。为此使用epsilon。
n可以预定义或基于某些功能(即图像大小的百分比)。
您也可以使用圆/椭圆而不是方形/矩形。选择最适合您需求的