C++ 高效地编辑图像中的像素

C++ 高效地编辑图像中的像素,c++,c,image,optimization,image-processing,C++,C,Image,Optimization,Image Processing,我有一个8位的图像存储在一个数组中,包含黑色0和白色255像素。假设我要将图像中的所有黑色像素更改为灰色120像素。我把黑色换成灰色的最快方法是什么 我想到了两种方法- 开始检查图像中的每个像素。一旦发现黑色像素,将其更改为灰色。继续,直到图像结束。慢但容易 开始检查像素。当发现黑色像素时,保持计数器跟踪它。继续递增计数器直到下一个白色像素。然后转到计数器,使用像memset这样的快速函数将一组黑色像素更改为灰色。不确定,但我认为这可能更快 我有一个巨大的1GB图像,因此方法1相当慢。是否有更好

我有一个8位的图像存储在一个数组中,包含黑色0和白色255像素。假设我要将图像中的所有黑色像素更改为灰色120像素。我把黑色换成灰色的最快方法是什么

我想到了两种方法-

开始检查图像中的每个像素。一旦发现黑色像素,将其更改为灰色。继续,直到图像结束。慢但容易

开始检查像素。当发现黑色像素时,保持计数器跟踪它。继续递增计数器直到下一个白色像素。然后转到计数器,使用像memset这样的快速函数将一组黑色像素更改为灰色。不确定,但我认为这可能更快


我有一个巨大的1GB图像,因此方法1相当慢。是否有更好的方法来更改/编辑像素?

我认为第一种方法的问题在于,根据内存体系结构/总线宽度的倍数,读取和写入相同的32/64/x位。如果读写一次与总线宽度对应的位,速度应该更快

在下面的代码片段中,getPixelsSizeOfLong根据总线的宽度返回位,比如4字节,这样就减少了缓存和cpu之间的传输位

// Forward declaration:
unsigned long getPixelsSizeOfLong(byteInImage unsigned int);
void          setPixelsSizeOfLong(byteInImage unsigned int, newBitValue unsigned long);

unsinged long l;

for (a=0; a+=sizeof(l); a<nof_pixels) {
  l  = getPixelsSizeOfLong(a);
  l |= 120;
  setPixelsSizeOfLong(a, l);
}

使用与单词对齐的访问一次只做一个单词可能会更快


您可以按位或按0x7878假设32位。这不会影响白色像素,但会将黑色像素设置为所需值。

对于1GB的图像,速度总是很慢。无论您的代码是什么,它都以RAM总线带宽运行。使用单指令多数据技术作为SSE可能会获得一些性能优势。