2

我现在正在从磁盘读取图像。图像可以是灰度图像或二值图像。但是,我无法从图像的头文件中分辨出来。我现在做的是告诉唯一像素的数量。如果唯一像素数大于两个,则图像为灰度;否则为黑白图像。我正在使用以下功能来完成这项工作:

  bool is_binary_image(  std::vector<unsigned char> &memory)
{
    std::set<unsigned char> myset;
    for(  std::vector<unsigned char>::iterator  it = memory.begin();
        it!= memory.end(); 
        it++)
    {
        myset.insert(*it);
        if (myset.size()>2)
            return false;
    }

    return true;

}

如果候选图像是灰度图像,这个函数可以做得很好。但是,如果候选图像是二进制的,那么该函数是耗时的。关于改进功能的任何想法?

4

3 回答 3

5

您可以通过使用数组而不是地图来加速它:

bool is_binary_image(  std::vector<unsigned char> &memory)
{
    int counter = 0;
    int pixels[256] = {};

    for(  std::vector<unsigned char>::iterator  it = memory.begin();
        it!= memory.end(); 
        it++)
    {
        pixels[*it]++;
        if (pixels[*it]==1)
          counter++;
        if (counter>2)
            return false;
    }
    return true;
}

编辑

这是优化版本(但可能不太可读),谢谢 TemplateRex:

bool is_binary_image(  std::vector<unsigned char> &memory)
{
    int counter = 0;
    int pixels[256] = {};

    for(  std::vector<unsigned char>::iterator  it = memory.begin();
        it!= memory.end(); 
        it++)
    {
        if ((counter += (++pixels[*it] == 1))>2)
            return false;
    }
    return true;
}
于 2013-07-18T11:22:57.623 回答
1

取第一个像素。然后搜索下一个不等于第一个像素的像素。现在继续搜索两者都不是的像素。如果你到达最后,它是一个二进制图像。

于 2013-07-18T11:22:50.607 回答
1

在不对图像做出任何假设的情况下,您确实无能为力(就迭代整个图像而言)。在最坏的情况下,图像中检查的最后一个像素具有第三个值,因此您必须检查所有像素以确保它不是灰度图像。

也就是说,你的方式是相当低效的。如果您知道黑白像素的可能值,您可以简单地遍历像素并检查该值是否不同于黑白像素。这将消除设置,并应显着提高性能。

于 2013-07-18T11:23:48.627 回答