SlideShare a Scribd company logo
1 of 19
Androidで画像処理リベンジ

  情報科学芸術大学院大学
     高井 大輔
自己紹介
•   で~ご@dego_96
•   情報科学芸術大学院大学 修士2年
•   高専、大学で画像処理の研究
•   Androidを初めて1年
※追加スライドです

        今回やること
•   ビット反転
•   グレイスケール化
•   コントラスト変換
•   2値化
はじめに
• 下準備フォルダの“HankoApp”をインポート
• ImageViewを使用して画像を表示
• レイアウトはxmlに記述(ImageViewだ
  け)
• 画像のリソースもxmlに記述
• メニューから画像処理を実行
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical" >

  <ImageView
    android:id="@+id/ImageView"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:contentDescription="@string/content_description"
    android:src="@drawable/lenna" />

</LinearLayout>
自分の画像を使う場合
HankoApp -> res -> drawable-hdpi に自分のPNG画像を置く

android:src="@drawable/lenna"   のlennaをファイル名(拡張子無し)に変
更
MainActivity.java(一部抜粋)
// -----------------------------------------------------------
// メニューメソッド
// -----------------------------------------------------------
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, Menu.FIRST, 0, "実行");
    menu.add(0, Menu.FIRST + 1, 0, "保存");
    return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case Menu.FIRST:
        // 画像処理メソッドを実行
        ImageProcessing();
        break;
    case Menu.FIRST + 1:
        saveBitmapToSd(); // 画像を保存
        break;
    default:
        return false;
    }
    return true;
}
MainActivity.java(一部抜粋)
  private void ImageProcessing()
  {
    // ImageViewからBitmapを取得
    ImageView imageView = (ImageView)findViewById(R.id.ImageView);
    Bitmap bmp = ((BitmapDrawable)imageView.getDrawable()).getBitmap()
       .copy(Config.ARGB_8888, true);

      // 画像の横幅と縦幅を取得
      int width = bmp.getWidth();
      int height = bmp.getHeight();

      // ピクセルデータを取得
      int[] pixels = new int[width * height];
      bmp.getPixels(pixels, 0, width, 0, 0, width, height);

      /* ↓↓ ここから画像処理のコードを記述 */
      /* ここまで */

      // ビットマップにピクセルデータをセット
      bmp.setPixels(pixels, 0, width, 0, 0, width, height);

      // ImageViewにBitmapをセット
      imageView.setImageBitmap(bmp);
  }
Bitmapの取得
// ImageViewからBitmapを取得
ImageView imageView = (ImageView)findViewById(R.id.ImageView);
Bitmap bmp = ((BitmapDrawable)imageView.getDrawable()).getBitmap()
         .copy(Config.ARGB_8888, true);




         Bitmap.copy(Bitmap.Config config, boolean isMutable);

         Bitmap.Config
         • Alpha_8         :Alpha のみ
         • ARGB_4444       :ARGB各4bit (最大値は128)
         • ARGB_8888       :ARGB各8bit (最大値は256)
         • RGB_565         :R 5bit、G 6bit、B 5bit、Alpha無
         し

         isMutable (変更可能な)
         デフォルトは“false”、“true”にしないとsetPixelsでエ
         ラー
ピクセルデータにアクセス
int getPixel(int x, int y); ← 遅いので使わない
int setPixel(int x, int y); ← 遅いので使わない
void getPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)
void setPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height)

ピクセル情報は1次元配列
横幅と高さはBitmap.getWidth()とBitmap.getHeight()で取得可能

              0000 0000 0000 0000 0000 0000 0000 0000
                  Alpha           Red            Green           Blue

              例) r = (pixel & 0x00FF0000) >> 16
ビット反転

 // ビット反転を行う
 for (int i = 0; i < width * height; i++) {
    // ビット反転して透明度を最大値にする
    pixels[i] = ~pixels[i] | 0xFF000000;
 }

 ※Alpha値を反転すると何も見えなくなります
グレイスケール1

        平均値によるグレイスケール
        for (int i = 0; i < width * height; i++) {
          // RGBカラー値を取得
          int r = (pixels[i] & 0x00FF0000) >> 16;
          int g = (pixels[i] & 0x0000FF00) >> 8;
          int b = (pixels[i] & 0x000000FF) >> 0;

            // グレー色を作成
            int gray = (r + g + b) / 3; // 平均
            int pixel = 0xFF000000 | (gray << 16) | (gray << 8) | gray;

            // ピクセルデータにセット
            pixels[i] = pixel;
R G B   }


  3
グレイスケール2

                       テレビ方式よるグレイスケール
                       for (int i = 0; i < width * height; i++) {
                         // RGBカラー値を取得
                         int r = (pixels[i] & 0x00FF0000) >> 16;
                         int g = (pixels[i] & 0x0000FF00) >> 8;
                         int b = (pixels[i] & 0x000000FF) >> 0;

                           // グレー色を作成
                           int gray = (int)(0.299f * (float)r + 0.587f * (float)g
                                            + 0.114f * (float)b);
                           int pixel = 0xFF000000 | (gray << 16) | (gray << 8) | gray;

                           // ピクセルデータにセット
0.299R 0.587G 0.114B       pixels[i] = pixel;
                       }
コントラスト変換1
    元画像で min < V < max のと
    き  V min
    V                            255
            max min
        int bright[] = new int[width * height];
        int max = 0, min = 256;
        for (int i = 0; i < width * height; i++) {
          // グレー色を作成(テレビ方式)
          int gray = (int)(0.299f * (float)r + 0.587f * (float)g
                      + 0.114f * (float)b);
          bright[i] = gray;
          // 最大値と最小値を取得
          if (max < gray) max = gray;
          if (min > gray) min = gray;
        }
        for (int i = 0; i < width * height; i++) {
          float after = (float)(bright[i] - min)
                           / (float)(max - min) * 255f;
          int gray = (int)after;
          pixels[i] = (0xFF000000 | (gray << 16) |
                        (gray << 8) | gray);
        }
コントラスト変換1

             20
              |
            239




             0
             |
            255
コントラスト変換2




                                           緑の線は累積度数を示す



             ① LookUpTableを作成する(上側緑の線)
             ② LookUpTableに従って明度変換


ヒストグラム画像は http://www.mis.med.akita-u.ac.jp/~kata/image/lenna/equalize.html より
コントラスト変換2
2値化



  黒   白
大津の2値化
                    分離度が最大になる閾値を求める方法
                              クラス間分散
                    分離度                       B
                              クラス内分散          W

                              2          2
                         N1   1    N2    2
                     W
                              N1   N2
                                     2                2
                         N1    1         N2       2
                     B
閾値以下 ⇒   クラス1                      N1    N2
閾値以上 ⇒   クラス2
                         N : 画素数
閾値を0 ~ 255で分離度を計算        μ : 明度の平均
                         σ : 明度の分散

More Related Content

What's hot

プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
 
今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン
Shinya Shimizu
 

What's hot (20)

TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門
 
クラシックな機械学習の入門 7. オンライン学習
クラシックな機械学習の入門  7. オンライン学習クラシックな機械学習の入門  7. オンライン学習
クラシックな機械学習の入門 7. オンライン学習
 
パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成
 
【DL輪読会】Can Neural Network Memorization Be Localized?
【DL輪読会】Can Neural Network Memorization Be Localized?【DL輪読会】Can Neural Network Memorization Be Localized?
【DL輪読会】Can Neural Network Memorization Be Localized?
 
【解説】 一般逆行列
【解説】 一般逆行列【解説】 一般逆行列
【解説】 一般逆行列
 
スパースモデリングによる多次元信号・画像復元
スパースモデリングによる多次元信号・画像復元スパースモデリングによる多次元信号・画像復元
スパースモデリングによる多次元信号・画像復元
 
SfM Learner系単眼深度推定手法について
SfM Learner系単眼深度推定手法についてSfM Learner系単眼深度推定手法について
SfM Learner系単眼深度推定手法について
 
ベイズ最適化
ベイズ最適化ベイズ最適化
ベイズ最適化
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
シンギュラリティを知らずに機械学習を語るな
シンギュラリティを知らずに機械学習を語るなシンギュラリティを知らずに機械学習を語るな
シンギュラリティを知らずに機械学習を語るな
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン今さら聞けないカーネル法とサポートベクターマシン
今さら聞けないカーネル法とサポートベクターマシン
 
フーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組みフーリエ変換と画像圧縮の仕組み
フーリエ変換と画像圧縮の仕組み
 
基礎からのベイズ統計学第5章
基礎からのベイズ統計学第5章基礎からのベイズ統計学第5章
基礎からのベイズ統計学第5章
 
CRC-32
CRC-32CRC-32
CRC-32
 
【DL輪読会】Unpaired Image Super-Resolution Using Pseudo-Supervision
【DL輪読会】Unpaired Image Super-Resolution Using Pseudo-Supervision【DL輪読会】Unpaired Image Super-Resolution Using Pseudo-Supervision
【DL輪読会】Unpaired Image Super-Resolution Using Pseudo-Supervision
 
[DL輪読会]Deep Learning 第2章 線形代数
[DL輪読会]Deep Learning 第2章 線形代数[DL輪読会]Deep Learning 第2章 線形代数
[DL輪読会]Deep Learning 第2章 線形代数
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
深層生成モデルを用いたマルチモーダル学習
深層生成モデルを用いたマルチモーダル学習深層生成モデルを用いたマルチモーダル学習
深層生成モデルを用いたマルチモーダル学習
 

Similar to Androidで画像処理リベンジ

バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
nmaro
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
Takashi Yoshinaga
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessing
ushiostarfish _
 
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
nmaro
 
30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座
Sakiyama Kei
 

Similar to Androidで画像処理リベンジ (20)

静岡Developers勉強会 HTML5&CSS3
静岡Developers勉強会 HTML5&CSS3静岡Developers勉強会 HTML5&CSS3
静岡Developers勉強会 HTML5&CSS3
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群
 
Linqで画像処理
Linqで画像処理Linqで画像処理
Linqで画像処理
 
文献紹介:Rethinking Data Augmentation for Image Super-resolution: A Comprehensive...
文献紹介:Rethinking Data Augmentation for Image Super-resolution: A Comprehensive...文献紹介:Rethinking Data Augmentation for Image Super-resolution: A Comprehensive...
文献紹介:Rethinking Data Augmentation for Image Super-resolution: A Comprehensive...
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化
 
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
文献紹介:TSM: Temporal Shift Module for Efficient Video Understanding
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
 
Hands on
Hands onHands on
Hands on
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessing
 
文献紹介:TinyVIRAT: Low-resolution Video Action Recognition
文献紹介:TinyVIRAT: Low-resolution Video Action Recognition文献紹介:TinyVIRAT: Low-resolution Video Action Recognition
文献紹介:TinyVIRAT: Low-resolution Video Action Recognition
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtype
 
CG2013 02
CG2013 02CG2013 02
CG2013 02
 
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発
 
30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座30分で博士号がとれる画像処理講座
30分で博士号がとれる画像処理講座
 

More from Daisuke Takai (6)

つ部 2015 09 こわくないネイティブライブラリの使い方
つ部 2015 09 こわくないネイティブライブラリの使い方つ部 2015 09 こわくないネイティブライブラリの使い方
つ部 2015 09 こわくないネイティブライブラリの使い方
 
Odd2014成果発表
Odd2014成果発表Odd2014成果発表
Odd2014成果発表
 
Androidにメイちゃんをしゃべらせてみた
AndroidにメイちゃんをしゃべらせてみたAndroidにメイちゃんをしゃべらせてみた
Androidにメイちゃんをしゃべらせてみた
 
Androidにしゃべらせるために
AndroidにしゃべらせるためにAndroidにしゃべらせるために
Androidにしゃべらせるために
 
Somの分かり易い解説
Somの分かり易い解説Somの分かり易い解説
Somの分かり易い解説
 
5分で分かる自己組織化マップ
5分で分かる自己組織化マップ5分で分かる自己組織化マップ
5分で分かる自己組織化マップ
 

Androidで画像処理リベンジ

  • 2. 自己紹介 • で~ご@dego_96 • 情報科学芸術大学院大学 修士2年 • 高専、大学で画像処理の研究 • Androidを初めて1年
  • 3. ※追加スライドです 今回やること • ビット反転 • グレイスケール化 • コントラスト変換 • 2値化
  • 4. はじめに • 下準備フォルダの“HankoApp”をインポート • ImageViewを使用して画像を表示 • レイアウトはxmlに記述(ImageViewだ け) • 画像のリソースもxmlに記述 • メニューから画像処理を実行
  • 5. main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ImageView android:id="@+id/ImageView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:contentDescription="@string/content_description" android:src="@drawable/lenna" /> </LinearLayout>
  • 6. 自分の画像を使う場合 HankoApp -> res -> drawable-hdpi に自分のPNG画像を置く android:src="@drawable/lenna" のlennaをファイル名(拡張子無し)に変 更
  • 7. MainActivity.java(一部抜粋) // ----------------------------------------------------------- // メニューメソッド // ----------------------------------------------------------- @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, Menu.FIRST, 0, "実行"); menu.add(0, Menu.FIRST + 1, 0, "保存"); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST: // 画像処理メソッドを実行 ImageProcessing(); break; case Menu.FIRST + 1: saveBitmapToSd(); // 画像を保存 break; default: return false; } return true; }
  • 8. MainActivity.java(一部抜粋) private void ImageProcessing() { // ImageViewからBitmapを取得 ImageView imageView = (ImageView)findViewById(R.id.ImageView); Bitmap bmp = ((BitmapDrawable)imageView.getDrawable()).getBitmap() .copy(Config.ARGB_8888, true); // 画像の横幅と縦幅を取得 int width = bmp.getWidth(); int height = bmp.getHeight(); // ピクセルデータを取得 int[] pixels = new int[width * height]; bmp.getPixels(pixels, 0, width, 0, 0, width, height); /* ↓↓ ここから画像処理のコードを記述 */ /* ここまで */ // ビットマップにピクセルデータをセット bmp.setPixels(pixels, 0, width, 0, 0, width, height); // ImageViewにBitmapをセット imageView.setImageBitmap(bmp); }
  • 9. Bitmapの取得 // ImageViewからBitmapを取得 ImageView imageView = (ImageView)findViewById(R.id.ImageView); Bitmap bmp = ((BitmapDrawable)imageView.getDrawable()).getBitmap() .copy(Config.ARGB_8888, true); Bitmap.copy(Bitmap.Config config, boolean isMutable); Bitmap.Config • Alpha_8 :Alpha のみ • ARGB_4444 :ARGB各4bit (最大値は128) • ARGB_8888 :ARGB各8bit (最大値は256) • RGB_565 :R 5bit、G 6bit、B 5bit、Alpha無 し isMutable (変更可能な) デフォルトは“false”、“true”にしないとsetPixelsでエ ラー
  • 10. ピクセルデータにアクセス int getPixel(int x, int y); ← 遅いので使わない int setPixel(int x, int y); ← 遅いので使わない void getPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height) void setPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height) ピクセル情報は1次元配列 横幅と高さはBitmap.getWidth()とBitmap.getHeight()で取得可能 0000 0000 0000 0000 0000 0000 0000 0000 Alpha Red Green Blue 例) r = (pixel & 0x00FF0000) >> 16
  • 11. ビット反転 // ビット反転を行う for (int i = 0; i < width * height; i++) { // ビット反転して透明度を最大値にする pixels[i] = ~pixels[i] | 0xFF000000; } ※Alpha値を反転すると何も見えなくなります
  • 12. グレイスケール1 平均値によるグレイスケール for (int i = 0; i < width * height; i++) { // RGBカラー値を取得 int r = (pixels[i] & 0x00FF0000) >> 16; int g = (pixels[i] & 0x0000FF00) >> 8; int b = (pixels[i] & 0x000000FF) >> 0; // グレー色を作成 int gray = (r + g + b) / 3; // 平均 int pixel = 0xFF000000 | (gray << 16) | (gray << 8) | gray; // ピクセルデータにセット pixels[i] = pixel; R G B } 3
  • 13. グレイスケール2 テレビ方式よるグレイスケール for (int i = 0; i < width * height; i++) { // RGBカラー値を取得 int r = (pixels[i] & 0x00FF0000) >> 16; int g = (pixels[i] & 0x0000FF00) >> 8; int b = (pixels[i] & 0x000000FF) >> 0; // グレー色を作成 int gray = (int)(0.299f * (float)r + 0.587f * (float)g + 0.114f * (float)b); int pixel = 0xFF000000 | (gray << 16) | (gray << 8) | gray; // ピクセルデータにセット 0.299R 0.587G 0.114B pixels[i] = pixel; }
  • 14. コントラスト変換1 元画像で min < V < max のと き V min V 255 max min int bright[] = new int[width * height]; int max = 0, min = 256; for (int i = 0; i < width * height; i++) { // グレー色を作成(テレビ方式) int gray = (int)(0.299f * (float)r + 0.587f * (float)g + 0.114f * (float)b); bright[i] = gray; // 最大値と最小値を取得 if (max < gray) max = gray; if (min > gray) min = gray; } for (int i = 0; i < width * height; i++) { float after = (float)(bright[i] - min) / (float)(max - min) * 255f; int gray = (int)after; pixels[i] = (0xFF000000 | (gray << 16) | (gray << 8) | gray); }
  • 15. コントラスト変換1 20 | 239 0 | 255
  • 16. コントラスト変換2 緑の線は累積度数を示す ① LookUpTableを作成する(上側緑の線) ② LookUpTableに従って明度変換 ヒストグラム画像は http://www.mis.med.akita-u.ac.jp/~kata/image/lenna/equalize.html より
  • 19. 大津の2値化 分離度が最大になる閾値を求める方法 クラス間分散 分離度 B クラス内分散 W 2 2 N1 1 N2 2 W N1 N2 2 2 N1 1 N2 2 B 閾値以下 ⇒ クラス1 N1 N2 閾値以上 ⇒ クラス2 N : 画素数 閾値を0 ~ 255で分離度を計算 μ : 明度の平均 σ : 明度の分散