コンピュータネットワーク基礎
2004.5.14

Back to index page

  1. 本日の作業内容



  2. 各種の注意事項

    小テストや宿題に関するコメント,先週のパスワード変更に関する情報などを口 頭で説明します.

  3. データ符号化(教科書第2章)

    • 画素と24ビットRGBカラー

      コンピュータの画面に色を表示するためには,教科書の図2.4にあるように光の 三原色である赤(Red)と緑(Green),青(Blue)の3色の強度の非で目的の色を表現 します.これらの色の強度は各色に8ビットが割り当てられているものが最近の 標準ですが,8ビットの2進数は先週の授業の文字コードのように2桁の16進数で 表記できます.そこで,16進数で目的の色を作るための基本的な知識を学習しま しょう.

      最初に,色の強度についてです.16進数が通常の文中に出てきたときに10進数と 混同されるのを防ぐために,16進数の場合には頭に0xをつけて表記することがあ りますので,ここではそれを使って紹介します.まず,色の強度が無い場合を 0x00とし,最大の場合を0xFFとします.これは10進数の0と255に相当しますので, 色の強度を256段階に分けて示すことができます.基本的な色は次のように表記 できます.

      16進RGB表記実際の色
      0xFF0000 
      0x00AA00 
      0x0000FF 
      0xFFFFFF 
      0x000000 
      0x888888 
      0xFFFF00 
      0x883300 
      青緑0x00BBBB 

      自分で色を試したい場合には,以下に示すページをダウンロードして,色の部分 のコードを編集して,ブラウザ で開いてみましょう.HTML言語で書かれていますので,色の指定は0xを使った表 記ではなく,#を使ったものになっています.どの部分かはソースを見れば分か るようになっています.

    • 画像圧縮を試す

      デジタル画像を扱う機会は最近非常に多くなっています.デジタルカメラの普及 に加え,携帯電話にカメラ機能が付加されたたことが大きな理由でしょう.画像 を扱う上で重要なことはその画像の形式を正しく認識し,適切な道具(ツール)で 処理することです.ですので,拡張子などから判断される各種の画像形式につい て知っておくことは重要です.

      教科書にはGIFとJPEG方式が紹介されていますが,GIFの特許問題を回避すること から開発が始まったPNG(ピング)形式も良く使用されますし,他にもいくつか画 像の表現形式がありますので,言葉として知っておく方が良いでしょう.

      BMP

      ビットマップ形式で,Windowsで使用されるビット情報をそのまま保存する形式 です.容量は画素数と色数がそのままですので,非常に大きなものになります.

      TIFF

      ティフ形式.1枚の画像データを種々の形式で一つにまとめて格納する方式.汎 用性はありますが,画像を扱うアプリケーションが無いと表示できません.容量 はやはり結構大きくなります.

      PS

      ポストスクリプト形式.Adobe社が開発した形式で,画像だけでなく文字なども 全てベクトル情報としてテキスト形式で保存しています.データ交換などで高い 汎用性を持っています.近年重要性を増しているPDFはPSを元に作られています.

      EPS

      PSデータをTeX(テフ,テック)に使用するための形式.名前だけは覚えておきま しょう.

      PICT

      ピクト形式.Macintoshで使用される画像形式です.

      そして,教科 書にあるように,それらをネットワークを介して伝送したりパソコンで処理する ためには,データ量を減らす「圧縮」が重要です.各種の方式がありますので, いくつか試してみましょう.ただし,いろいろと問題があるので,GIF形式は扱 いません.

      まずは,何か基本となる画像を用意する必要があります.ペイントツールで作成 してみましょう.コマンドラインからツールを起動します.

      $ xpaint &

      これによりXpaintが起動します.先ず図1に示すパレットウィンドウが表示さ れます.

      図1 Xpaint起動時のツールウィンドウ

      「ファイル」メニューから「新規キャンバス」を選択すると図2に示すキャンバ スが表示されますので,最初に開いたツールウィンドウから筆やペンなどのツー ルを選択し,キャンバス下部の色パレットで色を選択して絵を描いてみて下さい.

      図2 新規キャンバス

      適当に描き終わったら保存します.「ファイル」メニューから「保存」を選択し て下さい.さまざまなフォーマットを選択できますが,まずは「XBM Format」を 選択して,paint.xbm として保存してみて下さい.ファイル容量を見 てみましょう.

      $ ls -l

      としてファイルのサイズを見てみましょう.200kB以上あると思います.これを ImageMagickと言うツールにより各種形式に変換してみます.

      $ convert paint.xbm paint.jpg
      $ convert paint.xbm paint.png

      などとしてみたときの,ファイルサイズの変化を見てみましょう.この convert コマンドはファイル名の拡張子を認識してそのフォーマットに変 換することが可能です.他に試せる形式はいくつもありますが,ここでは上記の 二つで十分でしょう.興味のある人はその他の形式を試してみても構いません.

    • 画像の加工

      画像のデータ圧縮も重要ですが,データのやりとりにおいて無駄な情報を削除し て必要な情報だけ抜き出すことも大切です.そのためには,画像の加工ツールが 必要です.WindowsやMacintoshでは商用ソフトウェアであるAdobe社のPhotoshop が良く使われますが,LinuxではフリーのThe Gimpという優れたツールがありま すので,それを試してみましょう.GNOMEメニューの「プログラム」「グラフィッ ク」の中にある「GIMP」を選択して起動することが出来ますし,ターミナルから

      $ gimp &

      でも起動できます.初めて使うときにはインストール作業が必要ですが,ひたす ら 「次へ」をクリックして行くと,インストール完了です.起動が完了すると,図 3に示すメインウィンドウとブラシ選択のパレット(図4)などのウィンドウが開き ます.

        
      図3 GIMPのメインウィンドウ 図4 ブラシ選択ウィンドウ

      ここで,加工の元になる画像を作成しましょう.コマンドラインで次のように入 力し,Enterを押したら,画面上のどこでも良いのでマウスでクリックしてみま す.

      $ xwd -frame -out window.xwd

      ぴっぴっと2回音がしてターミナルにコマンドプロンプトがもどって来たら作業 完了です.GIMPから今保存したファイルを開いてみます.ファイルメニューから 「開く」を選択して今作成した window.xwd を選択してみましょう. 画面にあったウィンドウがそのまま画像として表示されたと思います.先ずは, 元画像のファイル容量をターミナルで

      $ ls -l

      で確認したら,GIMP上でウィンドウの一部を切り取って別名で保存する作業を行 います.メインメニューのアイコン列の左上にある点線の□ボタンをクリックし て選択モードとし,任意の部分を選択してください.その後で,ウィンドウ内の 任意の場所で右クリックして出てくるメニューの中から「編集」「コピー」を選 択します.次に,右クリックで出てくるメニューの中から「ファイル」「新規」 を選択すると,ウィンドウのサイズを指定する画面が出てきます.ここはそのま ま「了解」して,新しいウィンドウを作ります.その中で右クリックして「編集」 「ペースト」とすると,先ほど選択した部分が張り付けられます.これを右クリッ ク,「ファイル」「保存」として,window2.xwd として新たに保存し てみましょう.そして,再び,

      $ls -l

      で容量を比較します.このときの容量は単純にドットの数に比例しているので, 見た目の通りに容量が変化していることと思います.

    • 画像圧縮の基本原理

      教科書の図2.4にあるように,コンピュータ上で表現している画像は2次元平面座 標の各点にある画素から形成されています.ここでは,ターミナルでRubyスクリ プトを使って,16×16ドットの白黒画像を作成し,圧縮の効果を試してみます.

      画像の例は次に挙げるような1もしくは0の数字で構成されたデータを使ってみま すが,自分で作成してみても構いません.

      data1.txt    data2.txt
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111111100000000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000
      1111000011110000

      これらを画像らしく見せるためにRubyスクリプトを使って作成したビューワーを 試します.

      while line = gets
        str = line.split(//)
        for i in 0..15
          if str[i] == "1"
            print "■"
          else
            print "□"
          end
        end
        print "\n"
      end

      作業は,コマンドラインで操作します.

      $ ruby display.rb data.txt

      のように,引数にデータファイルを指定して実行します."1"と指定した部分が 塗りつぶしの■,"0"は透明な□に対応して表示します.乱数を発生させてラン ダムに白黒が表示されるようなデータも作ってみます.ランダム数字列を作成するスクリプトを以 下に示します.

      for i in 0..15
        for j in 0..15
          print rand(2)
        end
        print "\n"
      end

      作業はコマンドラインで実行しますが,結果を保存するにはリダイレクトを使い ます.

      $ ruby rand.rb > data3.txt

      「リダイレクト」は「わかる&使えるUNIX基礎講座入門編」(以後,基礎講座 と言います.)のp.101に説明があります.

      画面で結果を見るには,リダイレクトは不要です.さて,これで,3種類のデー タが揃いましたので,実際に原始的な圧縮アルゴリズムで試してみます.

      data1.txtの中身を見ると,最初は"1"が続き,その後"0"が並んでいます.これ を,"1"が8個と言う意味で1x8のように変換すると,8文字を使用していたデータ が3文字で済みます.これが,もっとも原始的な圧縮方式と言えます.このアル ゴリズムを実際に実行するスクリプトを以下に示しま す.

      data = ""
      while line = gets
        data += line.chomp
      end
      
      data_array = data.split(//)
      a = data_array[0]
      newdata = [a]
      
      number =[1]
      count = 1
      j = 0
      
      for i in 1..255
        if  data_array[i] == a
          count += 1
          number[j] = count
        else
          a = data_array[i]
          count = 1
          j += 1
          newdata[j] = a
          number[j] = 1
        end
      end
      
      zipped_data = []
      
      for i in 0..j
        if number[i] > 1
          zipped_data[i] = number[i].to_s + "x" + newdata[i]
        else
          zipped_data[i] = newdata[i]
        end
      end
      
      print zipped_data, "\n"

      スクリプトの実行は,次のようにして行います.

      $ ruby encode.rb < data1.txt

      これで,画面にずらずらと文字が表示されます.この結果を保存するには,さら にリダイレクトを使用して,

      $ ruby encode.rb < data1.txt > zipped_data1.txt

      のようにします.最初に用意した3種類のデータに対してこの圧縮を実行して, ファイルの容量を比較してみましょう.

      なお,この圧縮されたデータをもう一度画像に戻すことは現状では出来ません. 可逆圧縮方式なのでデータの圧縮結果をもうちょっといい表現で実行すれば,元 のデータに戻せますが,ここではそこまでの作業はしません.

      現実の画像圧縮には,より洗練された方式が使用されていますので,このような 原始的なものよりもはるかにデータ容量を小さくできます.しかし,JPEGなどは 非可逆圧縮であるので圧縮後に再び元の画像には戻せませんし,圧縮するたびに画像が劣化し ていきます.

    • その他

      音声や動画像についてもデジタル化されたデータが普通になって来ています.こ れらのデータは時系列が問題になるため,文字や静止画とは異なる特徴がありま す.講義ではこれらについては扱いませんが,補足説明を行います.

  4. 小テスト

    授業の終了20分前くらいにAクラスBクラス別の小テストを実施します.アナウ ンスに注意してください.また,提出は電子メールにより行いますので,メール の送信準備は忘れないでいて下さい.

  5. 宿題

    授業の終りに宿題(AクラスBクラス)の説明をしますので,アナウンスに注意してください.


目次ページへ戻る