デジタル画像とC言語.

Slides:



Advertisements
Similar presentations
第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
Advertisements

画像情報処理 1 プログラミング課題 知的画像処理研究室 M2 大村 瑞穂. 目次 プログラミング課題の準備 – ファイルのダウンロード・解凍・コンパイル サンプルプログラムの説明 画像処理の方法 レポートに載せる画像について 例題と第 1 回レポート課題.
画像情報処理1 ~画像処理プログラミング~ 2015/05/01 知的画像処理研究室 M1 吉原寛樹
RitsPen 2.0 起動方法 CentOS を 例にして. CentOS を起動した状態 RitsPen がインストールしておく.デスクトップに ritspen というフォルダがあるはず.
初年次セミナー 第13回 2次元グラフィックス(1).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報処理演習 (9)グラフィックス システム科学領域 日浦 慎作.
初年次セミナー 第8回 データの入力.
初年次セミナー 第4回 整数と実数の取り扱い.
Linux リテラシ 2006 第2回 基本コマンド2.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第2章 数値の入力と変数 scanfと変数をやります.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
ファイル操作と文字列の利用.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
2014/05/02 知的画像処理研究室 M1 中津美冴 画像情報処理1 ~画像処理プログラミング~ 2014/05/02 知的画像処理研究室 M1 中津美冴
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
基礎プログラミング演習 第10回.
C言語講座 第3回 ポインタ、配列.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
行列による画像処理 デジタル表現論 担当者:劉 雪峰 2017年6月1日.
プログラミング応用 printfと変数.
Cプログラミング演習 第7回 メモリ内でのデータの配置.
画像処理プログラムの説明.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
プログラミング演習I 2003年5月7日(第4回) 木村巌.
前回の練習問題.
プログラミング演習Ⅱ 課題4第3週 画像処理 (1) ビット演算子.
第7回 プログラミングⅡ 第7回
ゲームプログラミング講習  第3章 ゲーム作成 ブロック崩しを作ります ゲームプログラミング講習 第3章 ゲーム作成.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
TA 高田正法 B10 CPUを作る   実験の前に TA 高田正法
UNIX演習 情報ネットワーク特論.
プロジェクト演習Ⅱ インタラクティブゲーム制作
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
疑似乱数, モンテカルロ法によるシミュレーション
画像処理プログラミング 知的画像処理研究室 M2 小林 佳奈美.
B演習(言語処理系演習)第2回 田浦.
UNIX演習 情報ネットワーク特論資料.
UNIX演習 情報ネットワーク特論資料.
UNIX演習 情報ネットワーク特論資料.
復習 2次元配列 4列 j = 0 j = 1 j = 2 j = 3 i = 0 i = 1 i = 2 3行
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
ネットワーク・プログラミング Cプログラミングの基礎.
C言語講習 第0章 Hello, world!.
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
情報処理Ⅱ 2005年11月25日(金).
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
マスク合成(のような処理) 出力画像 Out 入力画像1 In1 In1 In2 Out 入力画像2 In
左右反転と180度回転 [0][xsize – 1] [0][0] → i ↓ j [ysize – 1][xsize – 1]
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
情報処理Ⅱ 小テスト 2005年2月1日(火).
第2章 数値の入力と変数 scanfと変数をやります.
C言語講座第5回 2017 構造体.
第5回 配列.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

デジタル画像とC言語

画像の表現 一般的に、画像は2次元配列で表現される 例:320x240(240行、320列)画素の濃淡画像   unsigned char image[240][320]; 説明:  unsigned = 符号なし  char = 文字型  unsigned char = 符号なしの文字型で        0~255 (=   )の値が表現できる

画像の操作(1) 位置が(x,y)である画素は, y行、x列にある画素である。 画素値の読出し: 0 行 1 行 2 行 y 行 画素値の読出し:  例: (x,y)の画素の値を変数vに代入する。    (変数vは既に定義しているものとする)   v = image[y][x];

画像の操作(2) 画素値の設定: 例: (x,y)の画素の値を128にセットする。 image[y][x] = 128; y 行 0 行 1 行 2 行 y 行 画素値の設定:  例: (x,y)の画素の値を128にセットする。    image[y][x] = 128;

画像操作の例:90度回転(1) y y’ x x y H x’ W W H 元画像の(x,y)の画素が回転した後の位置(x’,y’)とする。    x’= H -1 – y; y’= x; 元画像を表す配列: image  回転した後の画像を表す配列: image_new とすると、 image_new[x][H-1-y] = image[y][x]; で回転したあとの画素値が設定できる。

画像操作の例:90度回転(2) y y’ x x y H x’ W W H int x,y; for (y = 0; y < H; y++) for (x = 0; x < W ; x++) image_new[x][H-1-y] = image[y][x];

画像の移動(1) y Δy Δx x H H Δx + x W W 画像をX方向にΔx, Y方向にΔyを移動する。  (x,y)の画素が移動後に (x’,y’)なるとすると、    x’= x + Δx; y’= y + Δy;

画像の移動(2) y Δy Δx x H H Δx + x W W Δy + y 元画像を表す配列: image  回転した後の画像を表す配列: image_new とすると、  image_new[y+Δy][x+Δx] = image[y][x]; で移動したあとの画素値が設定できる。

しかし 画像内の移動(3) (x0,y0) 画像を表す配列: image 移動する矩形部分の左上の角の座標: (x0,y0) 横幅、縦幅: w, h 水平、垂直方向の移動量、dx, dy とすると、 int x, y; for (y = y0; y < y0+h; y++) for (x = x0; x < x0+w; x++) { xnew = x + dx; ynew = y + dy; image[ynew][xnew] = image[y][x]; } で図に示すように矩形部分の画像を移動することができる。 h dy w dx しかし

画像内の移動(1) (x0,y0) 移動元 と 移動先 と 重なる 部分があると、 処理は難しくなる。 dy h dx dy h 移動元 と 移動先 と 重なる 部分があると、 処理は難しくなる。 dy h dx dy h (x0,y0) dx

間違った! 画像内の移動 移動の順序(1) int x, xnew; for (x= 0; x < 4; x++) { 画像内の移動 移動の順序(1) int x, xnew; for (x= 0; x < 4; x++) { xnew = x + 2; image[xnew] = image[x]; }     移動前               正しい結果               1 2 3 4 5 6 7 8 9  1 2 1 2 3 4 7 8 9 1 2 1 4 5 6 7 8 9  x: 0, xnew: 2 image[2] = image[0] 1 2 1 2 5 6 7 8 9  x: 1, xnew: 3 image[3] = image[1] 1 2 1 2 1 6 7 8 9   x: 2, xnew: 4 image[4] = image[2] 1 2 1 2 1 2 7 8 9   x: 3, xnew: 5 image[5] = image[3] 間違った!

正解! 画像内の移動 移動の順序(2) int x, xnew; 画像内の移動 移動の順序(2) int x, xnew; for (x= 3; x >= 0; x--) { /* 逆の順でコピーする */ xnew = x + 2; image[xnew] = image[x]; }     移動前               正しい結果               1 2 3 4 5 6 7 8 9  1 2 1 2 3 4 7 8 9 1 2 3 4 5 4 7 8 9  x: 3, xnew: 5 image[5] = image[3] 1 2 3 4 3 4 7 8 9  x: 2, xnew: 4 image[4] = image[2] 1 2 3 2 3 4 7 8 9   x: 1, xnew: 3 image[3] = image[1] 1 2 1 2 3 4 7 8 9   x: 0, xnew: 2 image[2] = image[0] 正解!

画像内の移動 移動範囲 (x0,y0) 移動した後の矩形領域は画像の範囲を超えることがある。 dy 画像内の移動 移動範囲 (x0,y0) 移動した後の矩形領域は画像の範囲を超えることがある。   この場合、移動しようとする矩形の画像範囲からはみ出す部分を削り、移動した後も画像の範囲内になるようにする。 (削り=矩形の形を変える) dy dx (x0,y0) dy dx

実際にプログラムを書いてみよう 画像処理のプログラムを書くために、画像処理用のライブラリが要る。 理由: 下記の機能が必要である。 理由: 下記の機能が必要である。  ① 処理しようとする画像の読込み    (ファイルなどから)  ② 処理結果を保存する画像の用意  ③ 処理結果をファイルに保存する が、これらの部分を作るのは面倒で、難しい。

RASLIB:画像処理演習用ライブラリ  RASLIBは、私(陳謙)が画像処理のプログラムを簡単に書けるために作ったライブラリである。  Linux版とWindows版両方あるが、Linux版をお勧めする。  以降の説明はLinux版に関するものである。 RASLIBのダウンロード  ① ダウンロード:RASLIBのWEBページ   http://www.wakayama-u.ac.jp/~chen/RASLIB/raslib.htm   からダウンロードできます。  そのページの“RASLIBの入手”の章から、raslib.tgzというファイルをダウンロードしてください。  (firefoxのデフォールトのダウンロード先は $HOME/Desktop です。)

RASLIB:画像処理演習用ライブラリ RASLIBのインストール 1.端末ウィンドウを開く。  1.端末ウィンドウを開く。  2.端末ウィンドウで次の命令を入力することにより、    ダウンロードした raslib.tgz ファイルを自分のホームに    移動する。     cd     mv $HOME/Desktop/raslib.tgz  .  3.以下の命令を実行して、必要なディレクトリを作ってください。   mkdir  include  lib  4.ダウンロードしたファイルを解凍します。   tar  xvzf  raslib.tgz  5.ソフトウェアをコンパイルし、インストールします。    cd  RASLIB    make  clean    make  PREFIX=$HOME  install これでインストールが完了します。

RASLIBを使って画像を生成する(1) 16x16画素 0 1 2 . . . 15 15 16 17 . . . 31 0 1 2 . . . 15 16x16画素 15 16 17 . . . 31 32 33 34 . . . 47 240 241 242 . . . 255 256x256画素の濃淡画像: 中身は16x16個=256個の正方形の領域である。 1個の領域の大きさは16x16画素で、画素値は全部同じである。   /* Begin grey_image_16x16.c */   #include “raslib.h” /* RASLIBを使うプログラムにはこれが必要 */ int main(int argc, char **argv) /* main関数はこのように書く */   {     Rasimg *img; /* 画像を現す関数。RASLIBでは、画像は Rasimg *型の変数で表現される。*/

RASLIBを使って画像を生成する(2) int block_x; /* 横のブロックの番号 */     int block_y; /* 横のブロックの番号 */ int v; /* ブロックの画素値 */ int x0, y0; /* ブロックの左上の角の座標 */ int x, y; unsigned char **image; /* 画像の中身を現す変数,画像を現す2次元配列のように使える */ img = ras_alloc(256, 256, 8); /* 256x256画素の濃淡画像(8bit)を用意する */ /* ras_alloc(横, 縦, ビット数) は 「横」x「縦」 画素で、 1画素が「ビット数」ビットの画像を用意するための関数である。*/ image = ras_lnidx(img); /* Rasimg *型の変数から、画像の中身を現す変数を取り出す。 その後、imageは2次元配列のように使える */     for (block_x = 0; block_x < 16; block_x++) { for (block_y = 0; block_y < 16; block_y++) { 現す関数。RASLIBでは、画像は Rasimg *型の変数で表現される。*/

RASLIBを使って画像を生成する(3) /* 画素値をセットする */   /* 画素値をセットする */ for (block_x = 0; block_x < 16; block_x++) { x0 = block_x * 16; for (block_y = 0; block_y < 16; block_y++) { y0 = block_y * 16; v = block_y * 16 + block_x; for (x = 0; x < 16; ++x) for (y = 0; y < 16; ++y) image[y+y0][x+x0] = v; } pnm_save(“grey256.pgm", img);     return 0;   }   /* End */

RASLIBを使って画像を生成する(4) コンパイルと実行  1.grey_image_16x16.c を作ります   emacs を使って、“ /* Begin grey_image_16x16.c */ から/* End */ までの部分の内容の「grey_image_16x16.c」というファイルを作る。  2 コンパイル   grey_image_16x16.c は次のようにコンパイルする。   cc -I$HOME/include -L$HOME/lib grey_image_16x16.c -o grey_image_16x16 -lras  3 コンパイルしたプログラムを実行する   ./grey_image_16x16    4 実行結果を確認する   gimp grey256.pgm  練習問題1:   grey_image_16x16.cを改造して(pnm_saveの前に追加)、作ったグレーブロックの画像を90度回転するプログラムを作りなさい。