buf - みる会図書館


検索対象: C言語による画像処理入門
6件見つかりました。

1. C言語による画像処理入門

19 1 画像の入力・補正・出力 ・図 1.12 左側の近傍の場合 : (err-dfs2. c) 例題 1-6 のプログラム中の A の条件式を次に変える . = x—sizel - 1 Ⅱ y = = y—sizel - 1 ) if ( x = 例題 1-6 のプログラム中の B を次のように変更する . buf[O][x + 1] = buf[0][x + 1] + err3 * 3.0 / 10.0 ; buf[l][x + 1] = buf[l][x + 1] + err3 * 2.0 / 10.0 ; = buf[l][x] + err3 * 3.0 / 10.0 ; buf[ 1 ][x] buf[l][x-l] = buf[l][x-l] + err3 * 2.0 / 10.0 ; ・図 1.12 右側の近傍の場合 : (err dfs3. c) 例題 1-6 のプログラム中の A の条件式を次に変える . if ( x く 2 Ⅱ x > x_sizel - 3 Ⅱ y = = y—sizel - 1 ) 例題 1-6 のプログラム中の B を次のように変更する . = buf[0][x + 1] + err3 * 2.0 / 10.0 ; buf[0][x + 1] = buf[0][x + 2] + err3 * 1.0 / 10.0 ; buf[0][x + 2] = buf[l][x + 2] + err3 * 1.0 / 10.0 ; buf[l][x + 2] buf[l][x + 1] = buf[l][x + 1] + err3 2.0 / 10.0 ; buf[ 1 ][x] = buf[l][x] + err3 * 2.0 / 10.0 ; = buf[l][x-l] + err3 * 1.0 / 10.0 ; buf[l][x-l] = buf[1][x-2] + err3 * 1.0 / 10.0 ; buf[1][x-2] 実行結果 : 図 1.11 ( a ) に示した原画像を , err-dfs2. c, err-dfs3. c によって擬似階調表 示した結果を , 図 1.13 ( a ) , ( b ) にそれぞれ示す . (b) 図 1.12 右側の近傍の場合 (a) 図 1.12 左側の近傍の場合 図 1.13 近傍を変えた場合の誤差拡散法による擬似階調表示

2. C言語による画像処理入門

1 画像の入力・補正・出力 buf[y][x] = 0.0 ; for (y = 0 ; y く y—sizel; y + + ) { for()= 0 ; x<x—sizel; x + + ) { 返か出る . と . きは里 2 値化する .. ツ だ近傍に応じて次の式を変える☆ / err3 = err2; image2[y][x] = MAX BRIGHTNESS; } else { err3 = errl; image2 [y][x] = 0 ; if( errl ま errl く err2 * err2 ) { err2 = modified—gray - MAX BRIGHTNESS; errl = modified—gray - 0.0 ; modified-gray = imagel[y][x] + buf[0][x] ; } else { else image2 [y][x] = MAX BRIGHTNESS; image2 [y][x] = 0 ; ・羸Ⅱ効萇 MAX ・ / 2 ) 三 if ( x = = x-sizel - 1 Ⅱ y..r=.y.-sizel - 1 ) { 三← A = buf[l][x] + err3 * 3.0 / 8.0 ; 三 buf[l][x + 1] = buf[l][x + 1] + err3 ☆ 2.0 / 8.0 ; 三ぐーー B ! buf[O][x + 1] = buf[()][x + 1] + err3 * 3.0 / 8.0 ; 三 b uf[ 1 ][x] 17 for ()= 0 ; x<x—sizel; x + + ) { b uf[0][x] = buf[ 1 ][x] ; buf[l][x] = 0.0 ; main( ) だ画像データを imagel に読み込む * / load—image—data( ) ; make-error-difusion-image( ) ; だ誤差拡散画像を作成する * / だ image2 を保存する * / save—image—data( ) ; return 0 ; 実行例 : 図 1.11 ( a ) に示す階調画像を誤差拡散法を用いて 2 値画像として表現した

3. C言語による画像処理入門

2 画像のフィルタリング power = 0 ; while ( number ! = 1 ) { power 十十 ; number = number > > 1 ; だ右方向に 1 ビットシフト ( 2 で割るのと同じ ) return power; void make initial—data( double *re—part, double *im—part, int num of—data, int power ) 35 だデータを並び替えて時間の間引きによる FFT の初期データを作るま / だ double *re-part, *im-part; 兀データ ( 実数部 , 虚数部 ) の先頭アドレス * / だ int num Of data; だ int power; int ptr, offset; int new—ptr; int dft; データ総数 num of—data は 2 の power 乗 / * 制御変数 だ元データの要素番号を決めるための変数 * / / * 計算後のデータを代入する配列の要素番号 だ DFT 点数 ( i のループで半分すつになる ) * / double re_buf[FFT_MAX] , im_buf[FFT MAX] ; だ計算結果用配列 * / dft = num of_data; for ()= 1 ; i く power; i 十十 ) { だ i は回数を制御する変数 ( 計算には用いていない ) new—ptr = 0 ; 0ffset = 0 ; while( new—ptr く num of—data ) { ptr = 0 ; while( ptr く dft ) { re_buf[new—ptr] = * ( re—part 十 0ffset 十 ptr ) ; im_buf[new_ptr] = ま ( im_part 十 0ffset 十 ptr ) ; ☆ ( im—part + j ) = im—buf[j]; * ( re—part + j ) = re—buf[j] ; for (j = 0 ; j < num of—data; j + + ) { だ計算結果を元のデータ配列にコピーする * / offset = offset + dft; if(ptr== dft) ptr= 1 ; ptr=ptr 十 2 ; new_ptr 十十 ;

4. C言語による画像処理入門

2 画像のフィルタリング for ( k = 0 ; k く dft; k + + ) { num in1 = num out; num in2 = num out; num—out = j * dft 十 k; だ ( 係数が 1 の方の信号を num_inl としている ) * / だ num_inl と num—in2 から num_out を出力 * / num in1 } else num in2 ー if( k く half){ だ実数部 ( re ー ) ・虚数部 ( im つに分けて計算 * / = num out - halfi ー num_inl + half; 37 ( re_part 十 num in2 ) ; re buf = ま im_buf = * ( im_part 十 num in2 ) ; re—part_new[num out] = * ( re—part 十 num inl ) + re buf * cos(angle) + im buf * sin(angle); im—part_new[num out] = * ( im part 十 num inl ) + im buf * cos(angle) - re—buf * sin(angle); だ角度を更新 angle = angle 十 step—angle; / * 計算後のデータを元の配列に戻す * / for (j = 0 ; j く num of—data; j + + ) { * ( re—part 十 j ) = re—part—new[j] ; * ( im—part 十 j ) = im—part—new[j]; dft=dft*2;/*DFT の点数を 2 倍に更新 * / だ逆 FFT ( flg = -1 ) のとき各データの複素共役をとる響 if ( flag = for (j = 0 ; j く num of—data;j + + ) { * ( im—part 十 j ) = * ( im—part 十 j ) ; 補足説明 : プログラム中で本バッケージ "FFTI. h" をインクルードした後 , 元データ の実数部 , 虚数部をそれぞれ double data[FFT_MA 刈 , jdata[FFT MAX]; と 宣言すれば FFT を利用できる . ただし配列の最大値である FFT MAX は本

5. C言語による画像処理入門

36 2 画像のフィルタリング dft = dft / 2 ; void FFTI( double *re_part, double *im_part, int num of_data, int flag ) だデータの FFT(flag=1), 逆 FFT(flag=-1) を行う関数 だ double *re-part, *im-part; 元データ ( 実数部 , 虚数部 ) の先頭アドレス * / データ総数 , FFT ・逆 FFT を決めるフラグ / * int num—of—data, flag; int i, 」 , k, power; double unit_angle, step_angle; だ制御変数 , べき乗 * / だ角度用の変数 * / int dft, half, num—of_dft; だ DFT 点数 , その半数 , DFT 実行回数 * / だ DFT の入出力信号線の番号 * / int num out, num inl, num in2; double re-buf, im-buf, angle; だ実数部 , 虚数部 , 角度用作業変数 * / / * 次は計算結果を一時的に保存するための作業用配列 static double re—part—new[FFT MAX], im—part—new[FFT MAX] ; だ逆 FFT(flg=-I) のとき各データを num_of_data で割り * / だ複素共役をとる if(flag = = -1){ for ( i = 0 ; i く num of_data; i + + ) { * ( re_part 十 i ) = * ( re_part 十 i ) / num of_data; * ( im—part 十 i ) = * ( im—part 十 i ) / num of—data; だ num—of—data が 2 の何乗 ( power ) であるか調べる * / power = calc_power of_two( num of_data ) ; だ初期データのための元データの順番の入れ替えま / make initial_data( re_part, im_part, num of_data, power ) ; だ2 点 DFT,4 点 DFT,8 点 DFT, …の順に実行する unit—angle = 2.0 * PI / num of—data; /*=DFT の点数の初期値 , 2 倍してゆく * / dft= 2 ; for ( i = 0 ; i < power; i + + ) { /*DFT 点の DFT を行う / * i=0 - > 2 点 , i=l - > 4 点 , i=2 - > 8 点 , . … * / /*DFT の実行回数ツ num of dft = num_of data / dft; step—angle = unit—angle ま num of—dft; half = dft / 2 ; for (j = 0 ; j < num—of—dft; j + + ) { angle = 0.0 ;

6. C言語による画像処理入門

16 1 画像の入力・補正・出力 この誤差を次式に示すように注目画素 p(), ) ) の近傍画素に分散して配分する . 点〃ゎは + 1 , ) + 1 ) : アは + 1 , ) + 1 ) * = 工は + 1 , ) + 1) + ( 2 / 8 ) xE は , ) ) ( 1.3 ) ( 1.4 ) ( 1.5 ) そして , 画素〃。は + 1 , ) ) , は + 1 , ) + 1 ) , は , ) + 1 ) については , 原画像の階 / は + 1 , ) + 1 ) * , 工は , ) + 1) * であったと考え , 調値がそれぞれ元々 / は + 1 , ) ) * , 同様な処理を続けてゆく . この処理によって , 1 画素で生じた表示誤差がその 周辺に分散され , 誤差が周期的に解消されることになり , 画像全体として見た ときの誤差を少なくしようとするものである . 例題 1 -6 : 誤差拡散法 図 1.9 の近傍と式 ( 1.3 ) ~ ( 1.5 ) を用いた誤差拡散法によって原画像を 2 値 化した画像を生成するプログラムを作成せよ . ただし , 黒画素を階調値 0 , 白画素を階調値 255 とする pgm 形式の階調画像として 2 値画像を表 現すること . 解答例 : / * 誤差拡散法のプログラム err_dfs. c 響 #include<stdio. h> #include<stdlib. h> #include"mypgm. h" void make—error difusion—image( ) だ原画像 imagel[y][x] の誤差拡散画像を作り image2[y][x] に代入響 : 注目占 だ誤差分散ー ー 3 / 8 ー 注 ) 最右列 , 最下行は誤差拡散しない * / ー 3 / 8 ー 2 / 8 ー intx, y; だループ変数 * / double errl, err2, err3; だ階調誤差 * / double buf[2][MAX IMAGESIZE] ; だ誤差保存用パッファ * / double modified_gray; / * 誤差拡散画像を作る * / printf(" 誤差拡散画像を作ります . vn"); y_size2 = y—size 1 ; X Size2 = x_sizel; だ 2 ライン分のバッフアのクリア * / for ( y = 0 ; y く 2 ; y + + ) for ( x = 0 ; x < x sizel; x 十十 )