Как я могу найти самые плотные области на изображении?

Обновление: Пожалуйста, взгляните на комментарии - этот ответ не соответствует вашему вопросу, но, возможно, он отвечает на другие вопросы пользователей, которые натолкнулись (я думаю, что из-за upvotes), поэтому я не буду удалять это " answer ":

Сначала: я знаю, что этот вопрос действительно устарел, но я искал именно эту проблему, и эта публикация была опубликована в Google # 1. Поэтому я реализовал версию docs.filter (принятый ответ), но, как я читал в mongoose v4.6.0 docs , мы теперь можем просто использовать:

Item.find({}).populate({
    path: 'tags',
    match: { tagName: { $in: ['funny', 'politics'] }}
}).exec((err, items) => {
  console.log(items.tags) 
  // contains only tags where tagName is 'funny' or 'politics'
})

Надеемся, что это поможет будущему пользователей поисковой системы.

13
задан John Doe 21 June 2015 в 02:34
поделиться

4 ответа

Если у вас есть доступ к 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');

И вот изображение, которое создает приведенный выше код:

enter image description here

Чтобы все выглядело хорошо, я просто продолжал пробовать несколько различных комбинаций параметров для Гауссова фильтра (созданного с помощью fspecial) и элемента структурирования (созданного с помощью strel). Однако, этот небольшой проб и ошибок дал очень хороший результат.

ЗАМЕЧАНИЕ: Изображение, возвращаемое с imregionalmax , не всегда имеет только один пиксель, установленный в 1 (для обозначения максимума). Выходное изображение часто содержит кластеры пикселей, потому что соседние пиксели во входном изображении могут иметь равные значения, и поэтому оба они считаются максимумами. В приведенном выше коде я также расширил эти точки с помощью imdilate просто для того, чтобы их было проще увидеть на изображении, что делает еще больший кластер пикселей, центрированный по максимумам. Если вы хотите уменьшить кластер пикселей до одного пикселя, то следует убрать шаг расширения и изменить изображение другими способами (добавить шум к результату или отфильтровать его, затем найти новые максимумы и т.д.)

.
18
ответ дан 1 December 2019 в 19:31
поделиться

если у вас есть инструментарий обработки изображений, размывайте его гауссовым фильтром, затем находите пики/экстрема.

варьируйте размер гауссового фильтра, чтобы получить количество "плотных" областей, которые вам нужны.

.
6
ответ дан 1 December 2019 в 19:31
поделиться
[

]Скользящее окно (простое, но медленное)[

] [

]Можно создать скользящее окно (например, размером 10x10 пикселей), которое будет итерировать над изображением, и для каждой позиции считать количество белых пикселей в этом поле 10x10, и сохранять позиции с наибольшим количеством.[

] [

]Весь этот процесс имеет вид []O(n*m)[], где n - количество пикселей изображения, а m - размер скользящего окна. [

] [

]Другими словами, вы [] свернете [] изображение со средним фильтром [] [] (здесь коробчатый фильтр), а затем используете экстремумы.[

] [

]Скользящее окно (быстрое)[

] [

]Сначала вычислите []суммированную таблицу площадей [], что может быть сделано очень эффективно за один проход: [

] [
    ] [
  1. ] создать 2D массив [] sat[] того же размера, что и исходное изображение [] img[].[
  2. ] [
  3. ][

    ] просуммировать каждый индекс и вычислить для каждого индекса [] 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
    [][
    ][
  4. ] [
  5. ][

    ]Теперь итерация по индексам таблицы суммированной области со скользящим окном и вычисление количества белых пикселей в ней по углам A, B, C, D скользящего окна:[

    ] [
    ][] img sat window
    0 0 1 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 2 3 6 6 6 0 D-----C 6
    [][
    ] [

    ]Рассчитать [

    ] [
    ][]плотность(x', y') = sat(A) + sat(C) - sat(B) - sat(D)
    [][
    ] [

    ]Что в приведенном выше примере составляет[

    ] [
    ][]плотность(1, 0) = 0 + 6 - 1 - 2 = 3
    [][
    ][
  6. ] [
] [

]Для этого процесса требуется временное изображение, но это всего лишь []O(n)[], поэтому скорость не зависит от размера скользящего окна.[

].
7
ответ дан 1 December 2019 в 19:31
поделиться
[

]Может быть, наивный подход:[

] [

]Вы определяете квадрат n*n, который является максимальным размером области, в которой вы измеряете плотность. Для каждой точки на изображении эта точка считается центром квадрата и отсчитывается вокруг количества черных (b) и белых (w) точек. Используя разность b-w, можно определить, в какой из квадратов наиболее белый.[

] [

]Наиболее плотные области должны быть определены нечетким образом. Если в одной области 600 белых точек, а в другой 599, то для человеческого глаза они имеют одинаковую плотность. 600 - это 100% плотность, а 599 - 99% плотность и 1% не плотность. Для этого используйте эпсилон.[

] [

]n может быть предопределено или основано на какой-то функции (т.е. проценте от размера изображения).[

] [

]Вы также можете использовать круг/эллипс вместо квадрата/прямого угла. Выберите то, что вам больше всего подходит[

].
4
ответ дан 1 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: