【问题标题】:How to detect if an image contains only white color with C++如何使用 C++ 检测图像是否仅包含白色
【发布时间】:2021-03-21 15:36:48
【问题描述】:

我们正在编写一个软件,它从 WMS 服务器(这些是地图服务器,它们提供图像作为全球各个位置的地图数据)从互联网上下载图块,然后使用 Qt 将它们显示在一个窗口中和一些 OpenGL 绑定。

其中一些服务器仅包含地球上特定区域的数据,如果您请求和区域超出他们支持的范围,它们只会为您提供一个空白的白色图像,我们不想使用它,因为它们占用了额外的空间.所以问题是:

如何识别图像是否仅包含一种颜色(白色)。

到目前为止,我们尝试过的如下:

  1. 创建一个QImage,循环遍历它的每个像素,看看它是否与白色不​​同。这非常慢,而且由于我们希望这是一个或多或少的实时应用程序,遗憾的是这个想法行不通。
  2. 检查图像大小是否与空图像大小相同,但这也不起作用,因为可能会发生以下情况:
  • 还有另一个相同大小的图像实际上包含数据
  • 可能是海洋上的瓷砖只有一种颜色,浅蓝色,我们需要这些瓷砖。
  1. 对下载的图像进行“后期处理”,稍后将其从场景中移除,但从用户的角度来看,这看起来很难看,瓷砖只是出现和消失......
  2. 从 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


【解决方案1】:

正确和最可靠的方法是解压缩 PNG 字节并在紧密循环中检查每个像素。

图像处理例程“慢”的最常见来源是按像素调用函数。因此,如果您在每个行/列的嵌套循环中调用 QImage::pixel,它将无法获得您想要的性能。

相反,利用 QImage 通过scanLine 方法或bits 方法为您提供原始图像字节的事实:

这样的事情可能会奏效:

const int bytes_per_line = qimage.bytesPerLine();

unsigned char white_row[MAX_WIDTH * 4];
memset(white_row, 0xff, sizeof(white_row));

bool allWhite = true;
for (int row = 0; allWhite && (row < height); row++)
{
    unsigned char* row_data = qimage.scanLine(row);
    allWhite = !memcmp(row_data, white_row, bytes_per_line);
}

上述循环在遇到非白色像素时会很快终止。

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多