gpt4 book ai didi

c++ - 灰度图像转换 Turbo C++

转载 作者:行者123 更新时间:2023-11-28 08:19:16 27 4
gpt4 key购买 nike

我正在尝试将 RGB 图像转换为灰度图像。 RGB图像是160*120*4,而我的灰度是160*120*1。但是,它只是给我纯黑色而不是我想要的,并且需要很长时间。

这是我写的,请指教。谢谢

int i, j, sum;
Image = new unsigned char [ 160 * 120 * 1 ];
for( int j = 0; j < 120; j++ ) {

for( int i = 0; i < 160; i++ ) {
sum=0;
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
*Image = sum/4;

PaintBox2->Canvas->Pixels[ i ][ j ] = *Image;
Image++;
}
}

最佳答案

我可以立即看到代码中的几个问题。最引人注目的来自最内层的 for 循环:

sum=0;
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ];
*Image = sum/4;

在这里,您只是将相同的值加到 sum 中四次,然后除以四。这使得这六行等同于

*Image = PaintBox1->Canvas->Pixels[ i ][ j ];

显然,您实际上想要对每个 channel 进行平均。如果您的 RGB 图像被实现为三维数组,这可能类似于:

sum = 0;
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 0 ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 1 ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 2 ];
sum += PaintBox1->Canvas->Pixels[ i ][ j ][ 3 ];
*Image = sum/4;

但是,从您的代码示例看来,您的 RGB 图像实际上是作为(无)符号整数的二维数组实现的。在这种情况下,以下代码就足够了(假设整数在您的机器上是四个字节):

sum = 0;
unsigned int pixel = PaintBox1->Canvas->Pixels[ i ][ j ];
for(int k = 0; k < 4; ++k)
{
sum += pixel & 0xFF;
pixel >>= 1;
}
*Image = sum/4;

我看到的另一个主要问题是您没有保留指向灰度数组开头的指针。您将其初始化为

Image = new unsigned char[ 160 * 120 * 1 ];

这很好。但是每次循环,你都写了

Image++;

相反,你应该保留一个指向数组开头的指针,并有一个充当迭代器的临时指针:

// before the for loops
Image = new unsigned char[ 160 * 120 * 1 ];
unsigned char * temp = Image;

// at the end of the inner for loop:
temp++;

因此,您只能围绕 temp 指针移动,而 Image 保持固定。

关于c++ - 灰度图像转换 Turbo C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561176/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com