C 将图像转换为灰度

C 将图像转换为灰度,c,algorithm,pointers,C,Algorithm,Pointers,如果在下面的代码片段(在这篇文章的底部)中,我需要编写一个将BMP转换为灰度的函数,我该怎么做?请注意,程序的main已经编写,并且已经编写了所有打开/关闭文件的功能等-这只需要函数本身 我的任务要求,对于每个像素,红色、绿色和蓝色的值被转换为三个像素的平均值,以便在某种程度上变成灰度,但我甚至不知道如何开始 包含以下库-请再次注意,这些库位于单独的文件中: #include <getopt.h> #include <stdio.h> #include <stdli

如果在下面的代码片段(在这篇文章的底部)中,我需要编写一个将BMP转换为灰度的函数,我该怎么做?请注意,程序的
main
已经编写,并且已经编写了所有打开/关闭文件的功能等-这只需要函数本身

我的任务要求,对于每个像素,红色、绿色和蓝色的值被转换为三个像素的平均值,以便在某种程度上变成灰度,但我甚至不知道如何开始

包含以下库-请再次注意,这些库位于单独的文件中:

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
我已经尝试过下面的潜在解决方案,但是我使用的
image[height][width]
似乎不起作用。然后,我当然需要用一个计算来替换
0x00
,该计算提供了三者的平均值。但不太确定如何改善这一点


{

    if(( image[height][width].rgbtRed==0xff && image[height][width].rgbtBlue==0x00 && image[height][width].rgbtGreen==0x00)||(image[height][width].rgbtRed==0xff && image[height][width].rgbtBlue==0xff && image[height][width].rgbtGreen==0xff)) 
    {
        image[height][width].rgbtRed=0x00;
        image[height][width].rgbtBlue=0x00;
        image[height][width].rgbtGreen=0x00;
    }
    return;
}


(如果我的行话弄错了,我很抱歉——我是个新手。)

你需要做的是计算每个像素的颜色,或者使用简单的平均值,通过注释中的@,或者然后将
R
G
B
像素的值设置为相同的值,并且图片是灰色的

像这样的

void grayscale(int height, int width, RGBTRIPLE image[][]){
    for(int x=0; x<width ; x++){
        for(int y=0; y<height; y++){
            unsigned int colour = 0.299*image[x][y].rgbtRed + 0.587*image[x][y].rgbtGreen + 0.114*image[x][y].rgbtBlue;
            image[x][y].rgbtRed = colour & 0xFF;
            image[x][y].rgbtBlue = colour & 0xFF;
            image[x][y].rgbtGreen = colour & 0xFF;
         }
    }
}
void灰度(整数高度、整数宽度、RGB三重图像[]){
for(int x=0;x
for(int i=0;i
这里没有解码或编码BMP的代码。您使用的是库吗?和“三个平均值”将RGB转换为灰色是一种很糟糕的方法。更好的方法是0.299R+0.587G+0.114B。没有正确的代码。请寻求帮助来填写。同样,主要功能在其他文件中。这是专门用于运行图像,然后逐像素转换图像。“三者的平均值”是我为我的任务得到的指示,所以这是我必须要做的。你有什么问题吗?我们不会为你编写代码,所以让我们知道你没有得到什么,这样我们就可以回答你的问题。添加了一个更新…听起来很严重。没有关于什么和在哪里的错误消息吗?解释之一ions是有符号整数溢出。我知道
color
不能超过255,但代码中可能不清楚。我将更新图像,至少只更新灰色?然后按照注释和帖子中的建议,使用浮点乘法进行修改。然后将代码加载到调试器中,并单步验证代码是否在t中执行他解释了问题的意图。高度和宽度可能会混淆。感谢您花时间写下答案,如果您能解释一下这个问题的作者遗漏了什么地方,或者他们如何找到您的解决方案,那就太好了。
void grayscale(int height, int width, RGBTRIPLE image[][]){
    for(int x=0; x<width ; x++){
        for(int y=0; y<height; y++){
            unsigned int colour = 0.299*image[x][y].rgbtRed + 0.587*image[x][y].rgbtGreen + 0.114*image[x][y].rgbtBlue;
            image[x][y].rgbtRed = colour & 0xFF;
            image[x][y].rgbtBlue = colour & 0xFF;
            image[x][y].rgbtGreen = colour & 0xFF;
         }
    }
}
for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {
        int gray = 
             (image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3.0 ;
        image[i][j].rgbtRed = gray ;
        image[i][j].rgbtGreen = gray;
        image[i][j].rgbtBlue = gray;
    }
}

return;