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