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

食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・Yoshie Kaneno
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター Unity Technologies Japan K.K.
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム信之 岩永
 
A quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSA quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSYoshifumi Kawai
 
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)博宣 今村
 
Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎なべ
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPMasashi Shibata
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you信之 岩永
 
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術Unity Technologies Japan K.K.
 
人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説Livesense Inc.
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeNA
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要Shumpei Shiraishi
 
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etc
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etcAzure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etc
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etcYoichi Kawasaki
 
UIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみよう
UIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみようUIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみよう
UIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみようTakahiro Miyaura
 

What's hot (20)

食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
食べログのフロントエンドエンジニアってめっちゃ大変やねん・・・
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
A quick tour of the Cysharp OSS
A quick tour of the Cysharp OSSA quick tour of the Cysharp OSS
A quick tour of the Cysharp OSS
 
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
猫でも分かるUE4を使ったARコンテンツ作り方 初級編 ver 1.0.0
 
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
オープンソースのドローン用フライトコントローラ「Dronecode」の概要( #OSC15tk)
 
Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎Javaで学ぶネットワークプログラミングの基礎
Javaで学ぶネットワークプログラミングの基礎
 
T4 Template 入門
T4 Template 入門T4 Template 入門
T4 Template 入門
 
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMPRTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
RTMPのはなし - RTMP1.0の仕様とコンセプト / Concepts and Specification of RTMP
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you
 
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
【Unity道場スペシャル 2017京都】最適化をする前に覚えておきたい技術
 
人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説人は一ヶ月でエンジニアになれるのか - 詳細解説
人は一ヶ月でエンジニアになれるのか - 詳細解説
 
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要JavaプログラマのためのWebSocket概要
JavaプログラマのためのWebSocket概要
 
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etc
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etcAzure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etc
Azure Search 言語処理関連機能 〜 アナライザー、検索クエリー、辞書、& ランキング, etc
 
UIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみよう
UIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみようUIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみよう
UIデザイン設計から開発をつなぐ「MRTK Figma Bridge for Unity」を使ってみよう
 

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

静岡Developers勉強会 HTML5&CSS3
静岡Developers勉強会 HTML5&CSS3静岡Developers勉強会 HTML5&CSS3
静岡Developers勉強会 HTML5&CSS3yaju88
 
OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群OpenCVの拡張ユーティリティ関数群
OpenCVの拡張ユーティリティ関数群Norishige Fukushima
 
文献紹介: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...Toru Tamaki
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Fixstars Corporation
 
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルTakashi Yoshinaga
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析法(2012年6月版)nmaro
 
動的計画法の並列化
動的計画法の並列化動的計画法の並列化
動的計画法の並列化Proktmr
 
文献紹介: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 UnderstandingToru Tamaki
 
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)
ARコンテンツ作成勉強会:C#ではじめようOpenCV(カラートラッキング編)Takashi Yoshinaga
 
Real timeimageprocessing
Real timeimageprocessingReal timeimageprocessing
Real timeimageprocessingushiostarfish _
 
文献紹介:TinyVIRAT: Low-resolution Video Action Recognition
文献紹介:TinyVIRAT: Low-resolution Video Action Recognition文献紹介:TinyVIRAT: Low-resolution Video Action Recognition
文献紹介:TinyVIRAT: Low-resolution Video Action RecognitionToru Tamaki
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介UnityTechnologiesJapan002
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtypetakesako
 
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)
バイオイメージング研究のためのImageJによるデジタル画像解析入門(2011年6月版)nmaro
 
Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Siv3Dで楽しむゲームとメディアアート開発
Siv3Dで楽しむゲームとメディアアート開発Ryo Suzuki
 
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

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

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で分離度を計算 μ : 明度の平均 σ : 明度の分散