【发布时间】:2021-03-21 15:36:48
【问题描述】:
我们正在编写一个软件,它从 WMS 服务器(这些是地图服务器,它们提供图像作为全球各个位置的地图数据)从互联网上下载图块,然后使用 Qt 将它们显示在一个窗口中和一些 OpenGL 绑定。
其中一些服务器仅包含地球上特定区域的数据,如果您请求和区域超出他们支持的范围,它们只会为您提供一个空白的白色图像,我们不想使用它,因为它们占用了额外的空间.所以问题是:
如何识别图像是否仅包含一种颜色(白色)。
到目前为止,我们尝试过的如下:
- 创建一个
QImage,循环遍历它的每个像素,看看它是否与白色不同。这非常慢,而且由于我们希望这是一个或多或少的实时应用程序,遗憾的是这个想法行不通。 - 检查图像大小是否与空图像大小相同,但这也不起作用,因为可能会发生以下情况:
- 还有另一个相同大小的图像实际上包含数据
- 可能是海洋上的瓷砖只有一种颜色,浅蓝色,我们需要这些瓷砖。
- 对下载的图像进行“后期处理”,稍后将其从场景中移除,但从用户的角度来看,这看起来很难看,瓷砖只是出现和消失......
- 从 WMS 服务器请求透明图像,但由于某些 OpenGL 故障,在渲染时,这些图像仅在某些(主要是低端)显卡上显示为黑色。
欢迎任何想法、要使用的库、方向甚至代码,我们需要 C++ 解决方案,因为我们的应用是 C++。
编辑对于那些建议仅从地图中的几个点采样像素的人:
上面的两张图片(是的,左边的图片在角落里包含了一小块挪威),如果我们假设图片是完全白色的,只采样几个点,则将被消除,以防这些都没有点实际上触及除白色以外的任何颜色。第二张图片链接:https://wms.geonorge.no/skwms1/wms.sjokartraster2?LAYERS=all&SRS=EPSG:900913&FORMAT=image/png&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&BBOX=-313086.067812500,9079495.966562500,0.000000000,9392582.034375001&WIDTH=256&HEIGHT=256&TRANSPARENT=false
【问题讨论】:
-
请准确说明您是如何做到的#1。如果您正在调用每像素调用,那么是的,它会很慢。此外,如果您没有启用完全优化进行编译,它会很慢。您可以通过遍历原始图像缓冲区并查看每个字节为 0xff(假设 8 位整数 RGB 数据,即)轻松测试白色像素。关于您的“实时”要求,测试图像的每个像素应该比实际下载图像快得多!!!有关特定于您的任务的更实用/有用的建议,请描述您正在处理的数据的实际格式。
-
如果所有白色图像文件完全相同(可能在删除所有可能包括日期/时间等信息的元数据之后),使用文件大小+检查几个像素(或使用文件缩略图或哈希算法)。
-
我对 Qt 不熟悉,但是 QImage::createMaskFromColor() 可以帮忙吗?它似乎允许您选择一种可以为图像创建透明蒙版的颜色。这无助于识别浪费的空间,但它可以隐藏方块以进行后期处理以进行清理。
标签: c++ qt image-recognition