我正在从磁盘读取图像。图像可以是灰度图像或二值图像。但是,我无法从图像的头文件中分辨出来。我现在要做的是告诉唯一像素的数量。如果唯一像素数大于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;
}
如果候选图像是灰度图像,则此功能可以很好地完成。但是,如果候选图像是二进制的,则该功能是耗时的。关于改进功能的任何想法?
答案 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)
在不对图像做任何假设的情况下,你可以做的事情并不多(就整个图像的迭代而言)。在最坏的情况下,图像中检查的最后一个像素具有第三个值,因此您必须检查所有像素以确定它不是灰度图像。
那就是说,你的方式是相当低效的。如果您知道黑白像素的可能值,则可以简单地遍历像素并检查该值是否与黑白不同。这将消除该集合,并应显着提高性能。