C言語での画像の画素値取得

このページでは、画像の画素値取得についての説明と、そのプログラムの例の紹介を行います。

画像の画素値取得

下の記事で解説している通り、画像データは画素値の集合です。

画像データの構造・画素・RAWデータについて解説画像データの構造・画素・RAWデータについて解説

この記事でも書いている通り、下記で確保したメモリ領域にRAW形式の画像(幅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]

プログラム例

main.c
#include "myJpeg.h"

int main(int argc, char *argv[]){

  RAWDATA_t raw;
  int x, y;
  unsigned char r, g, b;
  char outname[256];

  if(argc != 2){
    printf("ファイル名指定してください\n");
    return -1;
  }

  if(jpegFileReadDecode(&raw, argv[1]) == -1){
    printf("jpegFileReadDecode error\n");
    return -1;
  }

  printf("取得したい画素のX座標は?");
  scanf("%d", &x);
  if(x < 0 || x >= raw.width - 1) {
    printf("座標がおかしいです\n");
    return -1;
  }
  printf("取得したい画素のY座標は?");
  scanf("%d", &y);
  if(y < 0 || y >= raw.height - 1) {
    printf("座標がおかしいです\n");
    return -1;
  }

  /* 画素値取得 */
  r = raw.data[y * raw.width * raw.ch + x * raw.ch];
  g = raw.data[y * raw.width * raw.ch + x * raw.ch + 1];
  b = raw.data[y * raw.width * raw.ch + x * raw.ch + 2];

  printf("画素値はR=%d, G=%d, B=%dです\n", r, g, b);


  freeRawData(&raw);

  return 0;
}

スポンサーリンク

プログラムの説明

JPEGファイルの読み込み・書き込み

下記記事と全く同じですのでこちらをご参照ください

C言語で画像の拡大縮小(最近傍補間編)

画素値の取得

下記で画素値を取得しています。raw.chには読み込んだ画像のチャネル数が格納されています。チャネル数というのは画素を構成する要素が何種類かどうかの情報と考えてください。読み込んだ画像はRGB画像ですので、チャネル数はRとGとBの3となります。

あとは画像の画素値取得の説明で行なった通りにRGB値を取得しています(ptrがraw.dataに、Mがraw.widthに、yがnに、xがmにそれぞれ置き換わっています)。

  r = raw.data[y * raw.width * raw.ch + x * raw.ch];
  g = raw.data[y * raw.width * raw.ch + x * raw.ch + 1];
  b = raw.data[y * raw.width * raw.ch + x * raw.ch + 2];

画素値取得結果

・入力画像

・画素値取得結果([150, 200]の画素値)

./getPixel.exe mini.jpg
width = 364, height = 500, ch = 3
取得したい画素のX座標は?150
取得したい画素のY座標は?200
画素値はR=121, G=144, B=175です

まとめ

この画像の画素値取得は、画像処理を行う上で必須の知識になります。是非この考え方を理解しておきましょう!

コメントを残す

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