★画像処理(グレースケール)★


次はグレースケール処理をやってみましょう。

グレースケールとは、白黒写真のようなものです。

カラー画像から色情報を抜き、明暗だけで表現します。

厳密な方法もありますが、簡単な方法でやってみます。

<sample program cpp036-01>

#include <iostream>
#include <fstream>

#include <Windows.h>

int main()
{
    std::ifstream ifsBitmap;

    ifsBitmap.open("omelet.bmp", std::ios::in | std::ios::binary);

    if (!ifsBitmap) {
        return 1;
    }

    BITMAPFILEHEADER bmFileHeader;

    ifsBitmap.read((char*)&bmFileHeader, sizeof(bmFileHeader));

    BITMAPINFOHEADER bmInfoHeader;

    ifsBitmap.read((char*)&bmInfoHeader, sizeof(bmInfoHeader));

    RGBTRIPLE *pColor = NULL;

    pColor = new RGBTRIPLE[bmInfoHeader.biWidth * bmInfoHeader.biHeight];

    if (!pColor) {
        if (ifsBitmap.is_open()) {
            ifsBitmap.close();
        }
        return 1;
    }

    ifsBitmap.read((char*)pColor, sizeof(RGBTRIPLE) * bmInfoHeader.biWidth * bmInfoHeader.biHeight);

    if (ifsBitmap.is_open()) {
        ifsBitmap.close();
    }

    //ここに画像処理のプログラムを書く

    const int PIXEL_NUM = bmInfoHeader.biWidth * bmInfoHeader.biHeight;

    unsigned int grayscale;

    for (int i = 0; i < PIXEL_NUM; i++) {

        grayscale = pColor[i].rgbtRed + pColor[i].rgbtGreen + pColor[i].rgbtBlue;

        grayscale /= 3;

        pColor[i].rgbtRed = (BYTE)grayscale;
        pColor[i].rgbtGreen = (BYTE)grayscale;
        pColor[i].rgbtBlue = (BYTE)grayscale;
    }

    std::ofstream ofsBitmap;

    ofsBitmap.open("result.bmp", std::ios::out | std::ios::binary);

    if (!ofsBitmap) {
        if (pColor) {
            delete[] pColor;
            pColor = NULL;
        }
        return 1;
    }

    ofsBitmap.write((char*)&bmFileHeader, sizeof(bmFileHeader));

    ofsBitmap.write((char*)&bmInfoHeader, sizeof(bmInfoHeader));

    ofsBitmap.write((char*)pColor, sizeof(RGBTRIPLE) * bmInfoHeader.biWidth * bmInfoHeader.biHeight);

    if (ofsBitmap.is_open()) {
        ofsBitmap.close();
    }

    if (pColor) {
        delete[] pColor;
        pColor = NULL;
    }

    return 0;
}

<実行結果>

続行するには何かキーを押してください・・・

3つの色情報を合計し、3で割った平均を求めました。

その平均値をRGBにそれぞれ入れました。

RGBの値に差が無くなりますから、どれかの色が突出することが無く、明暗だけが残ります。

では、プロジェクトフォルダの「result.bmp」を見てください。

別の方法にも挑戦したい方は、各自で調べてやってみてください。


次へ

戻る

目次へ