質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

8503閲覧

主成分分析を画像で行う場合

pipimaru

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/10/01 16:05

主成分分析を使うのですが、主成分分析について検索すると画像に対して主成分分析している記事をよく見ます。
自分でこうしたプログラムをCで書きたい(C++は触ったことがなく、そうした記事のプログラムはちょっと触った程度では読めなかったです)のですが、どうも自分でプログラムを書いていてうまく行きません。
プログラム自体がかけないというより、画像で主成分分析を行う場合なにをどこに当てはめるのかがわかりません。
具体的に言うと説明変数の項目、データがなにに当たるのかがわかりません。
主成分分析について詳しい方、C言語またはわかりやすい表現でどうか教えて下さい。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

画像で主成分分析を行う場合なにをどこに当てはめるのかがわかりません。
具体的に言うと説明変数の項目、データがなにに当たるのかがわかりません。

画像は色情報をもつピクセルデータの2次元集合とみなせます。いわゆるフルカラー画像の場合、ピクセルデータ1個は(r,g,b)といった3要素ベクトルで表現できます。また画像には幅W×高さH分だけのピクセルデータが含まれます。以上より、1つの画像を 3 × W × H 個の値で構成された多次元ベクトルとみなせます。

画像に主成分分析(PCA; principal component analysis)を適用する場合、上記の(3xWxH)次元ベクトルを対象データとみなすのが一般的でしょう。

投稿2015/10/02 02:58

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もう解決済みのようですが、主成分分析を触ったことがあるので回答します。
(すでに回答されている方の説明の情報を少し整理するという意味で。)

最初に、主成分分析に適用する画像としては「白黒画像」(グレースケールの画像)のみをまずは考えられると良いと思います。yohhoyさんのおっしゃる通り画像データは色要素×平面のデータなので、例えば色の表現にrgbを使用すれば3parameter × 16pixel × 16 pixel = 768個の要素で1枚の画像が構成されるようになり、初学者が扱うにはちょっと厄介です。

さて、このグレースケールの白黒画像は各セルに色の濃度が格納された行列形式のデータとみなすことができます。これを今度は1列に並べ直してベクトル形式のデータに変換します。

そして、ここからよく誤解されることがあるのですが、画像データに主成分分析を実行するときは「1枚の画像データを圧縮する」のではなく「多数の画像データを圧縮する」ということをします。すなわち、ベクトル形式に変換された多数の画像データをデータ行列にし、基準化(平均を0にする)、分散共分散行列の固有値・固有ベクトル or データ行列の特異値分解などを実施し、主成分ベクトルの抽出や、重要な主成分ベクトルだけで張られる空間へのデータの圧縮等を行うものです。

すなわち、

・データ:多数の画像

・説明変数:各セル内の色の濃度
(主成分分析では「説明変数」ではなく、単に「変数」と呼ぶのが一般的です。「説明変数」は回帰分析において「目的変数」の非確率要素を「説明」するための変数という意味だと理解されれば良いかと。)

ということになります。
以上、ご参考まで。

投稿2015/10/10 16:00

Victorian-Vat

総合スコア104

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pipimaru

2015/10/12 15:01

一枚の画像から主成分分析をするのは一般的ではないということですね。 とても参考になります。ありがとうございます。
guest

0

私は 主成分分析 についても、画像処理C言語によるプログラミング についても素人ですが…

まず、理解を深めるには、もっと目的を絞った方が良いと思います。
0. 「画像に対して主成分分析」といっても分野がとても広い
0. 主成分分析や画像処理にとって必ずしもC言語が向いている訳ではない

1)画像処理と主成分分析
noobさんもご存知のように、主成分分析とは

多次元のデータを情報量をなるべく落とさずに低次元に要約する手法

です。 (ご参考

デジカメの進歩に象徴されるように、画像データは「解像度×色の表現力」が爆発的に増大して、処理しなければならないデータ量は増加の一途を辿っています。そこで「低次元に要約」する技術が重要になってくる訳ですが…大きく分けると

画像処理 → 画質改善、画質を落とさずデータ圧縮、などを目的とした「フィルタリング」

⇒ 例)[情報源を再構成できる独立成分の抽出とその工学的応用](http://www.taf.or.jp/report/21/pdf/p426.pdf) (PDF)

画像認識 → 顔認識、手書き文字認識、などを目的とした「自動認識」

⇒ 例)[主成分分析PCAを用いて手書き数字を分析する。その1](http://qiita.com/kenmatsu4/items/c61ce5d85667f499c3c8)

に大別されます。どちらも背景となる技術は同じなのですが具体例を挙げて勉強した方が理解が進むので、現時点でより関心のある方を当面の教材として選ばれると良いと思います。

2)主成分分析を用いた処理のプログラミングについて
主成分分析は統計学の基礎技術なので、結果を得ることだけが目的なのであれば、統計解析専用のソフトを使用したり、自らプログラミングしたいならRのような統計処理用のプログラミング言語を使用するのが得策です。

しかしながら、今回の場合は「プログラムをCで書きたい」とのご希望ですので、その意味では選択の余地はありませんね。

とは言え、主成分分析のためのデータ処理は、実際のところ「行列計算」に過ぎないのですが、「数値計算」というのはそれだけで一つの研究分野になっているほど奥が深く難しい問題なので、全てを独力でプログラミングすることは必ずしも得策ではなく、一般的には専門家が開発した「ライブラリ」を使用します。

有償・無償のライブラリがいくつもあるようですが、一度「GNU Scientific Library(GSL)」について調べてみられてはいかがでしょうか。 (ご参考

以上、ご参考まで。

投稿2015/10/01 17:40

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問