このページでは、画像の画素値取得についての説明と、そのプログラムの例の紹介を行います。
画像の画素値取得
下の記事で解説している通り、画像データは画素値の集合です。
画像データの構造・画素・ビットマップデータについて解説この記事でも書いている通り、下記で確保したメモリ領域にBITMAP形式の画像(幅M・高さN)を展開した場合、
/* 幅がM、高さがNのRGB画像分のメモリ領域を確保 */
ptr = malloc(sizeof(char) * M * N * 3);
(m, n)座標の画素へは
画像の先頭アドレス +(3 × m)+(3 × M × n)
のアドレスにアクセスすれば良いです。このアドレスが(m, n)画素の先頭アドレスであり、このアドレスにRの値が格納されており、このアドレス+1バイトのところにGの値が、さらにアドレス+2バイトのところにBの値が格納されています。
ですので、RGBそれぞれの輝度値はそれぞれ下記のアドレスに格納されています。
R:画像の先頭アドレス +(3 × m)+(3 × M × n)
G:画像の先頭アドレス +(3 × m)+(3 × M × n)+1
B:画像の先頭アドレス +(3 × m)+(3 × M × n)+2
mallocで確保したメモリには配列のように扱うことも可能ですので、配列にアクセスする事で画素値を取得することも可能です。この場合は配列の添字を下記のようにする事で、(m, n)座標の画素のRGB値にアクセスする事ができます。
R:ptr[3 * m + 3 * M * n]
G:ptr[3 * m + 3 * M * n + 1]
B:ptr[3 * m + 3 * M * n + 2]
プログラム例
#include "myJpeg.h"
int main(int argc, char *argv[]){
BITMAPDATA_t bitmap;
int x, y;
unsigned char r, g, b;
if(argc != 2){
printf("ファイル名指定してください\n");
return -1;
}
if(jpegFileReadDecode(&bitmap, argv[1]) == -1){
printf("jpegFileReadDecode error\n");
return -1;
}
printf("取得したい画素のX座標は?");
scanf("%d", &x);
if(x < 0 || x >= bitmap.width - 1) {
printf("座標がおかしいです\n");
return -1;
}
printf("取得したい画素のY座標は?");
scanf("%d", &y);
if(y < 0 || y >= bitmap.height - 1) {
printf("座標がおかしいです\n");
return -1;
}
/* 画素値取得 */
r = bitmap.data[y * bitmap.width * bitmap.ch + x * bitmap.ch];
g = bitmap.data[y * bitmap.width * bitmap.ch + x * bitmap.ch + 1];
b = bitmap.data[y * bitmap.width * bitmap.ch + x * bitmap.ch + 2];
printf("画素値はR=%d, G=%d, B=%dです\n", r, g, b);
freeBitmapData(&bitmap);
return 0;
}
スポンサーリンク
プログラムの説明
JPEGファイルの読み込み・書き込み
下記記事と全く同じですのでこちらをご参照ください
C言語で画像の拡大縮小(最近傍補間編)画素値の取得
下記で画素値を取得しています。bitmap.chには読み込んだ画像のチャネル数が格納されています。チャネル数というのは画素を構成する要素が何種類かどうかの情報と考えてください。読み込んだ画像はRGB画像ですので、チャネル数はRとGとBの3となります。
あとは画像の画素値取得の説明で行なった通りにRGB値を取得しています(ptrがbitmap.dataに、Mがbitmap.widthに、yがnに、xがmにそれぞれ置き換わっています)。
r = bitmap.data[y * bitmap.width * bitmap.ch + x * bitmap.ch];
g = bitmap.data[y * bitmap.width * bitmap.ch + x * bitmap.ch + 1];
b = bitmap.data[y * bitmap.width * bitmap.ch + x * bitmap.ch + 2];
スポンサーリンク
画素値取得結果
・入力画像
・画素値取得結果([150, 200]の画素値)
./getPixel.exe mini.jpg
width = 364, height = 500, ch = 3
取得したい画素のX座標は?150
取得したい画素のY座標は?200
画素値はR=121, G=144, B=175です
まとめ
この画像の画素値取得は、画像処理を行う上で必須の知識になります。是非この考え方を理解しておきましょう!