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