有效编辑图像中的像素

时间:2011-03-02 06:55:37

标签: c++ c image optimization image-processing

我有一个包含黑色(0)和白色(255)像素的8位图像(存储在数组中)。假设我想将图像中的所有黑色像素更改为灰色(例如120)像素。什么是我可以将黑色变为灰色的最快方式。

我想到了两种方法 -

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

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

  3. 我有一个巨大的1GB图像,因此方法1非常慢。是否有更好(更快)的方式来更改/编辑像素?

2 个答案:

答案 0 :(得分:6)

一次一个字可能更快(使用单词对齐访问)。

您可以使用0x78787878(假设为32位)按位OR。这不会影响白色像素,但会将黑色像素设置为所需的值。

答案 1 :(得分: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);
}