2D中的最小/最大滑动窗口

时间:2012-05-24 07:16:28

标签: window minimum sliding

假设给出了一个大小为NxN且整数为k的窗口大小的整数矩阵。我们需要使用滑动窗口找到矩阵中的所有局部最大值(或最小值)。这意味着如果像素与其周围窗口中的所有像素相比具有最小(最大)值,则应将其标记为最小(最大)。 存在一种众所周知的滑动窗口最小算法,其在矢量中找到局部最小值,但不在矩阵中 http://home.tiac.net/~cri/2001/slidingmin.html

你知道一个可以解决这个问题的算法吗?

2 个答案:

答案 0 :(得分:6)

由于最小滤波器是可分离滤波器,因此可以通过计算每个维度的最小1D滑动窗口来计算最小2D滑动窗口。对于4x4矩阵和2x2窗口,算法的工作原理如下:

假设这是开头的矩阵

3 4 2 1
1 5 4 6
3 6 7 2
3 2 5 4

首先,分别计算矩阵每行的1D滑动窗口

3 2 1
1 4 4
3 6 2
2 2 4

然后,计算前一个结果的每列的最小1D滑动窗口。

1 2 1
1 4 2
2 2 2

结果与直接计算2D窗口的最小滑动窗口的结果相同。这样,您可以使用1D滑动窗口最小算法来解决任何nD滑动窗口最小问题。

答案 1 :(得分:1)

这是上述方法的c ++实现。

<!DOCTYPE html>
<html>
<head>
    <title>Example Map</title>
    <link rel='stylesheet' href='https://openlayers.org/en/v6.4.3/css/ol.css' type='text/css'>
    <script src='https://openlayers.org/en/v6.4.3/build/ol.js' type='text/javascript'></script>
    <style>
        html, body, #map {
            margin: 0 0 0 0;
            padding: 0 0 0 0;
            width: 100%;
            height: 100%;
        }
    </style>
</head>

<body>
    <div id="map" class="map" >
    </div>

    <script>
        'use strict';
        var mapview = new ol.View({ center: [-11000000, 4600000], zoom: 4  });
        var raster_layer = new ol.layer.Tile({
            source: new ol.source.OSM({
                url: "https://c.tile.openstreetmap.org/{z}/{x}/{y}.png"
            })
        });

        var map;    
        var vector_source = new ol.source.Vector();
        var vector_layer = new ol.layer.Vector({ source: vector_source });

        map = new ol.Map({layers: [raster_layer, vector_layer], target: 'map', view: mapview});
    </script>
</body>
</html>