数组或图像中的唯一值数字

时间:2013-07-18 11:15:51

标签: c++ image-processing stl

我正在从磁盘读取图像。图像可以是灰度图像或二值图像。但是,我无法从图像的头文件中分辨出来。我现在要做的是告诉唯一像素的数量。如果唯一像素数大于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;

}

如果候选图像是灰度图像,则此功能可以很好地完成。但是,如果候选图像是二进制的,则该功能是耗时的。关于改进功能的任何想法?

3 个答案:

答案 0 :(得分:5)

你可以使用数组代替map来加快速度:

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;
}

答案 1 :(得分:1)

拍摄第一个像素。然后搜索不等于第一个像素的下一个像素。现在向前搜索一个既不是两个像素的像素。如果你重新结束,它是一个二进制图像。

答案 2 :(得分:1)

在不对图像做任何假设的情况下,你可以做的事情并不多(就整个图像的迭代而言)。在最坏的情况下,图像中检查的最后一个像素具有第三个值,因此您必须检查所有像素以确定它不是灰度图像。

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