プログラミング演習Ⅱ 課題4第3週 画像処理 (1) ビット演算子 1 全体の流れ 画像ファイルを開き,画像データをメモリ上にロード(済) ロードした画像データに処理を加える (第3・4週) 処理後のデータを出力ファイルに書き出す (済) 画像データ用に確保したメモリを解放 (済) 2 画像バッファの様子(再確認) → i pImage xsize ysize level pBuffer 256 192 255 pImage->pBuffer[0][0] PIXEL構造体, {R, G, B} → i ↓ j ysize個 ↓ j 位置[0][0]のRにアクセス: pImage->pBuffer[0][0].r pImage->pBuffer[j] xsize個 3 画像の90度回転 ipRotateImage [0][0] [0][ysize – 1] → i ↓ j xsize個 ysize個 xsize個 ysize個 関数内で作業用の画像バッファメモリを確保し, 順に画素を埋めていけばよい. iioMallocImageBuffer iioFreeImageBuffer 4 ビットマスクを用いた 画像の減色処理 ipBitMask 原画像 RGB各色 0~255 2563 = 16,777,216 色 減色画像の例 0, 16, 32,...,240 163 = 4096色 下位4bitは全て0 5 ビット演算 (1) unsigned char A = 113; /* 0111 0001 */ unsigned char B = 15; /* 0000 1111 */ unsigned char D; D = A & B; D = A | B; D = A >> 3; /* AND: 0000 0001 */ /* OR: 0111 1111 */ /* SHIFT: 0000 1110 */ 他にもXOR(^), 左シフト(<<),NOT(~)がある 6 ビット演算 (2) unsigned char A = 113; /* 0111 0001 */ char C = -64; /* 1100 0000 */ char D; D = A >> 3; D = C >> 3; /* 0000 1110, 14 */ /* 1111 1000, -8 */ 符号なし変数のシフト: 隙間は0で埋められる (論理シフト) 符号あり変数のシフト: 隙間は最上位ビットで埋められる* (算術シフト) *注意: 符号あり変数のシフト結果は環境によって異なることがあるため, 負の数のビットシフトは極力避けるようにする 7 練習問題 (1) 変数の型と初期値 unsigned char A = 3; unsigned char B = 33; unsigned char D = 0; 結果 式 2進 D = A & B A: 0000 0011 B: 0010 0001 D: D = A | B A: B: D: 16進 10進 (0x03, 3) (0x21, 33) 8 練習問題 (2) 式 結果 D=A^B A: B: D: D = B << 2 B: D: D = B >> 3 B: D: 9 練習問題 (3) 式 結果 D = ~A A: D: B >>= 3 実行前 B: 実行後 B: 10 画素のビットマスク ipBitMask 各画素値の下位6ビットを0にしたい場合 pImage->pBuffer[j][i].r &= 0xC0; pImage->pBuffer[j][i].g &= 0xC0; pImage->pBuffer[j][i].b &= 0xC0; 16進: C0 2進:1100 0000 例: r = 100 rの2進表現 0 1 1 0 0 1 0 0 0xC0の2進表現 1 1 0 0 0 0 0 0 r & 0xC0 0 1 0 0 0 0 0 0 下位6ビットが0のマスク(0xC0)と&を取ることで,画素値の 階調を制限している (結果,画素値は0, 64, 128, 192のいずれかになる) 11 第3週目の目標 ビット演算の練習問題を解く コマンドライン引数の最初のmodeによって画 像処理の種類を指定できるようにせよ. > ex4_2.exe [mode] [inputfile] [outputfile] modeが0の場合: 画像を90度回転 modeが1の場合: 画像の各画素の下位”4”ビットを 0でマスク(6ではないので注意) 上記以外: 画像処理を行わない(ファイルのコピー) 12
© Copyright 2024 ExpyDoc