【问题标题】:Efficiently editing Pixels in an Image有效地编辑图像中的像素
【发布时间】:2011-07-07 01:35:21
【问题描述】:

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

我想到了两种方法-

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

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

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

【问题讨论】:

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

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


【解决方案1】:

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

您可以对 0x78787878 进行按位或运算(假设为 32 位)。这不会影响白色像素,但会将黑色像素设置为所需的值。

【讨论】:

    【解决方案2】:

    我认为第一种方法的问题在于您多次读取和写入相同的 32/64/x 位(取决于内存架构/总线宽度)。如果对总线宽度对应的位进行一次读写,应该会更快。

    在下面的 sn-p 中,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);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 1970-01-01
      • 2022-09-27
      • 2020-03-29
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多