ここではC言語で画像データを扱い、画像処理する方法・画像処理プログラムの紹介をします。
Contents
C言語で画像処理を学ぶ意義
プログラミングを学ぶ上で画像処理は良い題材だと思ってます。
楽しく学べる
1つ目の理由は楽しく学べることです。
扱うデータが馴染みのある画像ですし、自分のプログラムで画像がどう変わるかが目に見えてわかるので楽しく学べると思います。
スポンサーリンク
ポインタが理解できる
2つ目の理由はポインタが理解できることです。
C言語でポインタは難所と言われています。
画像処理プログラミングをやっていると「画像データのどこにどうやってアクセスするか」をポインタを使って考えることも必要で、ポインタを使ったプログラミングをする機会も多いです。
画像処理を通してポインタに慣れたり理解を深めることもできますので、ポインタを学びたい人にもおすすめです。
学べることが多い
3つ目の理由は学べることが多いことです。
このページにも書いていますが画像データの構造や画像データのフォーマットなどの画像関連のことだけでなく、三角関数や補間などの数学的要素の知識も必要になります。
2つ目の理由にも挙げたようにポインタの利用も必要です。
また画像処理は処理が重いケースが多く、それをいかにして高速に処理するかの高速化についても考える必要があります。
JPEG や TIFF などの難しいフォーマットの画像を扱うために OSS をリンクしたプログラム作成も必要になります。
画像処理プログラミングではたくさんの知識・考慮が必要になりますので、最初は敷居が高いかもしれませんが、かなりプログラミングの力をつけることが出来ると思います。
画像データの構造
画像処理プログラミングを行う上で画像データの構造を知ることは必要不可欠です。
下の記事では画像データとは何か?画素とは何か?ビットマップデータとは何か?について説明していますので、是非読んでみてください。

スポンサーリンク
画像処理を行う手順
C言語の画像処理プログラミングでは次のような手順を踏んで行うのが一般的です。
JPEG や TIFF 等の画像ファイルを読み込みます
読み込んだデータをデコードしビットマップデータ形式へ変換します
ビットマップデータ形式の画像データに対して画像処理を実行します
画像処理後の画像データをエンコードし、JPEG や TIFF 形式に変換します
エンコードしたデータをファイルに書き出しします
要は、画像処理しやすい形式のビットマップデータ形式に変換してから画像処理を行おう!というわけです。
なぜなら、JPEG や TIFF などの画像フォーマットは画像の中身は圧縮のために符号化されており、画像処理プログラミングを行うのに適していないためです。
ちなみに入出力するファイルの形式がビットマップデータ形式で問題ない方は STEP.2 と STEP.4 は省いて良いです。
が、ビットマップデータ形式の画像はサイズが大きいですし、読み込めないソフトやアプリが多い点に注意が必要です。
画像の読み込み・デコード・エンコード・画像のファイル保存
で、STEP.3 の部分がまさに画像処理を行う手順になります。
なので、言ってしまうと、STEP.1 〜 STEP.2 の画像の読み込みとデコードは画像処理を行うにあたっての前作業であり、STEP.4 〜 STEP.5 のエンコードと画像のファイル保存は画像処理の後作業です。
しかし、実はこの中の特にデコードとエンコードのプログラムを作成するのは難しく、ここが画像処理プログラミングを行うにあたっての大きなハードルとなっています。
このサイトではこれらを libjpeg や libpng 等のライブラリを用いて簡単に実現する方法を下の記事にまとめています。画像処理プログラミングを始めたいと思っている方は是非読んでみてください。
JPEGファイル
こちらの記事では libjpeg ライブラリを用いた JPEG ファイルのデコード・エンコードするプログラムを紹介していますので、よろしければ参考にしてください。

スポンサーリンク
TIFFファイル
またこちらの記事では libTIFF ライブラリを用いた TIFF ファイルのデコード・エンコードするプログラムを紹介しています。

PNGファイル
さらにこちらの記事では libpng ライブラリを用いた PNG ファイルのデコード・エンコードするプログラムを紹介しています。

WebPファイル
こちらでは libwebp ライブラリを用いた WebP ファイルのデコード・エンコードするプログラムを紹介しています。

スポンサーリンク
PNMファイル
PNM 形式は簡単に言ってしまうと「ビットマップデータ形式の画像データにヘッダが付加された形式」です。
ですので、画像サイズは大きいものの、画像のデコードが簡単(ヘッダを読み込んで画像サイズ等を取得すれば良いだけ)なので、STEP.2 と STEP.4を簡単に実行することができます。
下記ページでは PNM ファイルを読み込んだり、PNM ファイルとしてファイル出力するプログラムを紹介しています。

C言語で画像処理してみよう
ビットマップデータ形式への変換、ビットマップデータ形式からの変換が行えるようになれば後は STEP.3 の画像処理プログラムを実装してやれば良いだけです。
このサイトでもいろいろな画像処理について記事を作成し、その記事内で詳細と実例プログラムを紹介していますので是非参考にしてください。
グレースケール変換
画像をモノクロ化する原理とプログラムを紹介します。

スポンサーリンク
画像の拡大縮小
画像の拡大縮小を行う原理とプログラムを紹介します。
・拡大縮小の原理

・最近傍補間法

・線形補間法

画像の回転
画像を回転する原理とプログラムを紹介します。

画像のアフィン変換
アフィン変換とは何か?をまず説明し、アフィン変換を行うプログラム例を紹介します。

スポンサーリンク
画像のトリミング
画像の一部を切り取ってトリミングする原理とプログラムを紹介します。

画像のスキュー
画像をスキューして平行四辺形化する原理とプログラムを紹介します。

画素値の取得
画像を加工する画像処理とは違いますが、画像の情報を取得するプログラムの一つとして画素値を取得するプログラムを紹介しています。

スポンサーリンク
アルファチャンネル付き画像の処理
アルファチャンネル付き PNG の扱い方、RGBA 画像から RGB 画像への変換方法などのプログラムを紹介しています。

画像処理の高速化
計算量の多い画像処理プログラムを高速化するポイントを紹介します。

マルチスレッドを用いた画像処理
画像の拡大縮小処理をマルチスレッド化する方法を紹介します。

スポンサーリンク
画像処理における逆行列の重要性
特に座標変換(アフィン変換・回転など)における逆行列の重要性、変換後座標でのループの重要性について説明します。

まとめ
このページで解説した内容を書きにまとめました!
- 画像処理はC言語プログラミングを学ぶのに最適
- 画像データはポインタを用いて簡単に扱える
- デコードとエンコードのプログラミングは難しいがライブラリを用れば簡単に実装可能
画像処理は自分のプログラミング結果がまさに目に見えて確認できるので楽しいです!オススメです!
是非みなさんも画像処理プログラミングに挑戦してみてください!