ゆうき( @BASEBALLY15 )です^^

今日は,どうしたんじゃ?

現在,C言語で画像処理の勉強をしています.
入力画像をそのまま出力したいのですが,コードの書き方が分かりません・・・

了解じゃ!
早速,コードを紹介していくぞ!
(※Visual Studio 2017を使用)

お願いします!

入力画像をそのまま出力するって,どういうこと?

画像を入力するためのコードが完成したけれど,本当に入力できているのか不安に感じたことはないですか?

特に初心者の方は,コード1つ1つの使い方を理解できていない場合が多いので,こういった不安を抱くことがあるのではないでしょうか?

そういった時に,入力画像をそのまま保存することで,ちゃんと入力できているかを確認することが出来ます.

初心者の方以外は,あまり使う機会が無いと思いますが,いざという時に使うことが出来るので,ぜひ参考にしてみて下さい^^

画像をRAW形式に変換しよう!(準備①)

画像の形式と言えば,『.jpeg』や『.png』を思い浮かべるのではないでしょうか?

実はこの形式のままでは,画像処理を行うことが出来ません.

画像処理を行うためには,画像をRAW形式に変換しておく必要があります.

以下のサイトで,RAW形式に変換する方法をご紹介しているので,先にそちらを見て頂いた方がいいかもしれません^^

(※OpenCVを使う場合は,.jpegや.pngでも扱えます.)

標準入力関数を使えるようにしよう!(準備②)

Visual Studio 2012以降』を使っている方は,標準入力を行うための関数を使うために,少し処理を行わなければいけません.

今から,その方法をご紹介します.

Visual Studioのヘッダーファイルを開いてください.

そして,『pch.h』をダブルクリックして,以下のコードを記述してください.

#define _CRT_SECURE_NO_WARNINGS

これで,標準入力を行うための関数(scanfやfopenなど)を使うことが出来ます^^

それでは,本題の『カラー画像の読み込みと保存の方法』についてご紹介します⤵

画像処理を行ってみよう!(本題)

カラー画像を読み込む前に・・・

まずは,ヘッダーファイルを記述し,読み込み用のファイルと保存用のファイルパスを用意します.

そして,画像のRGB値の配列と今回作成した関数のプロトタイプ宣言を行います.

#include "pch.h"
#include "stdio.h"
//exitを使う際に必要
#include "stdlib.h"

//画像サイズを定義する
#define X_SIZE 640
#define Y_SIZE 480

//読み込みと保存用のファイルパスを用意
char read_path[500];
char save_path[500];

//入力のRGB値を用意
unsigned char r_in[Y_SIZE][X_SIZE], g_in[Y_SIZE][X_SIZE], b_in[Y_SIZE][X_SIZE];


//関数のプロトタイプを宣言する
void read_img(char *read_path, unsigned char r_in[Y_SIZE][X_SIZE], unsigned char g_in[Y_SIZE][X_SIZE], unsigned char b_in[Y_SIZE][X_SIZE]);
void save_img(char *save_path, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE]);

メインとなる関数を作成しておこう!

カラー画像の読み込みと保存を行う前に,メインとなる関数を作っておきます.

実行した時に,メイン関数内に書かれているコードが動作します.

void main(void)
{
	//入力画像の読み込み
	read_img(read_path, r_in, g_in, b_in);

	//出力画像の保存
	save_img(save_path, r_in, g_in, b_in);

}

カラー画像を読み込もう!

次に,カラー画像を読み込むための関数を作成します.

//入力画像の読み込み
void read_img(char *read_path, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
{
	int i, j;

	//ファイルためのファイルを用意
	printf("読み込むファイル-->");
	//標準入力をバッファに格納する
	scanf("%s", read_path);

	FILE *fp;

	//ファイルを開く
	fp = fopen(read_path, "rb");

	//もし,ファイルが無いときに終了させる
	if (fp == NULL)
	{
		printf("ファイルが存在しません", read_path);
		exit(-1);
	}

	//画像内からRGB値の取得(ラスタ走査)
	for (j = 0; j < Y_SIZE; j++)
	{
		for (i = 0; i < X_SIZE; i++)
		{
			r[j][i] = fgetc(fp);
			g[j][i] = fgetc(fp);
			b[j][i] = fgetc(fp);
		}
	}

	//ファイルを閉じる
	fclose(fp);

}

カラー画像を保存しよう!

最後に,カラー画像を保存するための関数を作成します.

//出力画像の保存
void save_img(char *save_path, unsigned char r[Y_SIZE][X_SIZE], unsigned char g[Y_SIZE][X_SIZE], unsigned char b[Y_SIZE][X_SIZE])
{
	int i, j;

	FILE *fp;

	printf("どのファイルに保存しますか?-->");
	scanf("%s", save_path);

	//ファイルを開く
	fp = fopen(save_path, "wb");

	////もし,ファイルが無いときに終了させる
	if (fp == NULL)
	{
		printf("ファイルが存在しません", save_path);
		exit(-1);
	}

	//画像のRGB値をファイルに保存する
	for (j = 0; j < Y_SIZE; j++)
	{
		for (i = 0; i < X_SIZE; i++)
		{
			fputc(r[j][i], fp);
			fputc(g[j][i], fp);
			fputc(b[j][i], fp);

		}
	}

	//ファイルを閉じる
	fclose(fp);
}

実行しよう!

メインとなる関数を実行すると,以下の画面が表示されます.

読み込むファイルと保存するファイルを書き込むと,完了です!!^^

終わりに

今回は,C言語を使って,カラー画像を読み込む方法と保存する方法についてご紹介しました.

この方法を応用させると,モノクロ画像や二値化画像を保存したり出来ます.

ぜひ,挑戦してみて下さい^^

今後,機会があれば,その方法についても投稿しようと思います!

それでは・・・

Q &A

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA