将图像变成灰度

时间:2019-10-04 00:20:44

标签: c algorithm pointers

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

我的作业要求将每个像素的红色,绿色和蓝色的值转换为这三个值的平均值,从而变得有些灰度,但甚至不知道如何开始。

包含以下库-再次注意,该库位于单独的文件中

#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>

这是我必须填写的代码段:

void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
    return;
}

我一直在尝试以下可能的解决方案,但是我对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;
}

(我很抱歉如果我的行话弄错了-我是一个非常新手的学习者。)

2 个答案:

答案 0 :(得分:1)

您需要做的是计算每个像素的颜色,要么使用朴素的平均值,要么在评论中使用the formula 0.299R + 0.587G + 0.114B suggested by @ Lee Daniel Crocker,要么使用some other method,然后设置{{ 1}} RG像素都具有相同的值,并且图片是灰色的。

类似这样的东西

B

检查您的数据类型是否为无符号的,这样您就不会对有符号的字节弄乱超过127个值的加法不感到惊讶

答案 1 :(得分:0)

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;