ヒストグラム 平坦 化。 ヒストグラム平坦化

「詳解OpenCV3」の備忘録

ヒストグラム 平坦 化

実行環境 Ubuntu 18. 04 Python 3. 9 OpenCV 3. 0 概要 大量の画像を処理する際、明るい写真や暗い写真が入り混じっており、 処理結果にも影響してしまうので、明るさを統一したい! という思いから、 学習の前処理で画像の輝度を調整する機会があったため、手法をまとめておく。 入力するカラー画像を、一様な明るさに正規化することを目的とする。 やってみた手法は以下の3種類。 靄がかかったタージマハル また、この画像の輝度ヒストグラムは次のように分布している。 100〜230あたりにかけて画素値が集中していることがわかる。 使用するライブラリ import cv2 import numpy as np from matplotlib import pyplot as plt 前処理 輝度値を扱うため、まずグレースケールの画像を取得する。 OpenCV の imread で引数を指定すると一発でグレースケール画像を取得できるが、 今回はカラー画像の輝度のみ変更する趣旨なので、色情報も取得しておく。 そこで、画像を読み込み、RGB(OpenCV だと BGR)から HSV への変換を行う。 HSVは画像を ・Hue 色相 ・Saturation 彩度 ・Value 輝度 で表しており、この中で輝度の Value を用いる。 Value を取得するコードは以下の通り。 cvtColor hsv , cv2. imwrite "result. ヒストグラムの平坦化は次のようなイメージ。 「平坦化」という言葉から、画像が滑らかになる印象が持たれるが、 実際は真っ黒な画素から真っ白な画素まで満遍なく出現するよう画素の値を調整するため、 コントラストが強調され、はっきりした画像になる。 この手法は OpenCV の関数で確認できる。 コードは以下の通り。 equalizeHist v 結果の画像とヒストグラムがこちら。 ヒストグラムを見ると、250付近の画素が離散的になっている。 これは、結果画像右上の光のグラデーション部分に表れており、コントラストが強調された影響でトーンジャンプが発生している。 元画像の輝度値のヒストグラム分布が一様ではないため発生するらしい。 もう少し丁寧にヒストグラムを平坦化させる手法が、次の適応的ヒストグラム平坦化。 詳しい仕組みやパラメータはを参照。 適応的ヒストグラム平坦化の実装は以下の通り。 apply v clipLimit はコントラストを制限するためのパラメータ。 tileGridSize は小領域のサイズで、今回は3x3の領域で行っている。 結果がこちら。 画像の輝度の平均値と標準偏差を取得し、それらを任意の値に変更するという手法。 uint8 配列のdtypeをunit8に戻す• mean v :輝度の平均値• std v :輝度の標準偏差 まず、元画像から輝度の平均値を引き標準偏差で割ることで、平均輝度0、標準偏差1の画像を生成している。 そこから任意の値 s をかけることで標準偏差を設定し、さらに任意の値 m を足すことで輝度平均を設定する。 今回は s=32 、m=128 で設定している。 結果はこちら。 ヒストグラムより、輝度平均128を中心に画素が集約されていることが確認できる。 おわりに 最後に、各結果をまとめて掲載しておく。 ヒストグラム平坦化後の条件が異なるので性能の比較実験ということではないが、参考まで。 今回は輝度のみ正規化を行ったが、コントラストや彩度も同様に正規化することで、 より一様な画像を作成できるだろう。 参考文献 ・ ・.

次の

ヒストグラム その2: ヒストグラム平坦化 — OpenCV

ヒストグラム 平坦 化

どなたか以下のヒストグラム均等化処理プログラムを解説して頂けないでしょうか。 特にgetMinMax関数とgetHistEqu関数で、何がしたいのか訳がわかりません。 以下のプログラムは、ヒストグラム均等化処理部分のみですが、分かる範囲でいいので、解説お願いします。 ここで、入力の輝度値のヒストグラムが 0: 600ピクセル 1: 600ピクセル 2: 600ピクセル 以下略 だったとしましょう。 変換後の各輝度値は256ピクセルしかおけませんから、 入力の輝度値0の600ピクセル中、256ピクセルは出力輝度値0、256ピクセルは出力輝度値1、88ピクセルは出力輝度値2になります。 入力の輝度値1に付いては、168ピクセル 入力輝度値0が使った残り が出力輝度値2、256ピクセルが出力3、176ピクセルが出力4になります。 入力の輝度値2に付いては、80ピクセルが出力輝度値4、256ピクセルが出力5、256ピクセルが出力6、8ピクセルが出力7になります。 と、こういう割当ピクセル数を計算するのが getMinMax ですね。 この計算結果を基に、入力輝度値から出力輝度値を算出するのが getHistEqu です。 可能なピクセル数の範囲で、min[x]~max[x]を順番に出力していきます。 ただし、7を8回出力したところで、出力7のピクセル数は使い切ってますから、 以降は、4, 5, 6, 4, 5, 6, … となり、 4を80回出力した所で、出力4のピクセル数は使い切るので、 以降は 5, 6, 5, 6, …という出力になります。 A ベストアンサー そちら関係の処理はしたことないですが、参考程度に。 ファイルの圧縮、加工はなぜ行われるのか。 それは、ファイルサイズを小さくしたり、見た目がよくなるようにするためです。 圧縮ならサイズを落とせないと意味ないですし、画像を綺麗に見せるなら醜くなっては意味がありません。 なので、処理の完璧さではなく、見た目の完璧さを求めた方がいいのではないかと思います。 (見比べるために、何度かプログラムを書いたり、設定を変えないといけないですが。 ) まぁ、見た目などと言うのは個人の感覚にかかわり、考え方によってプログラムの癖が出てきます。 しかし、絶対にそうしなくてはならないと言う規則はないはずなので、自分で満足できるようがんばってください。 Q 画像を平滑化する手法にガウシアンフィルタというものがあります。 現在、このガウシアンフィルタをCで作成しようとしていますが、いまいち分かりません。 自分なりに調べてみたところ、平滑化の移動平均フィルタやメディアンフィルタに関しては様々な書籍やサイトがあるのですが、ガウシアンフィルタに関してはあまり見つかりませんでした。 行いたい処理は、簡単に次の通りです。 できれば、ソースプログラムも書いてあると助かります。 当方、参考書籍として、「C言語で学ぶ実践画像処理-井上他」という本を使用しています。 手元では正しく動いているように思えましたが、 ご自分で確認してください。 Q 今、平滑化フィルタを作っています。 できればサンプルコードをかいていただければ ありがたいです。 今、平滑化フィルタを作っています。 A ベストアンサー >今、平滑化フィルタを作っています。 >下記のようなプログラムであっているのでしょうか? (「ような」を「考え方の」としてアドバイス) ダミーデータで試行してみては・・。 >もっと、効率のよい書き方があれば、アドバイスよろしくおねがいします。 >もっと... A ベストアンサー doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。 また、一般的には、桁が多いとその分計算時間がかかります。 ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。 ですが、実際には「一概に言えない、処理系依存」です。 しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速にできたり、と様々です。 32bitCPUでは、32bitのfloatの方が扱いやすいでしょうが、64bitCPUでは64bitのdoubleの方が扱いやすいかもしれません。 Cのmath. hで使える標準関数はdouble型のものがほとんどです。 三角関数は2Dのゲームでも使う機会が多いのではないでしょうか。 sinもcosもdouble型です。 内部演算は当然doubleですので、変数にfloatを使ったからと早くはならず、むしろfloat型の変数に入れるときに暗黙の型変換が発生する分遅くなる可能性もあります。 そういった背景を考え検討した結果、floatを使う方がよい、と判断したのならいいのですが、「先生に言われた」では理由になりません。 聞けるのなら、その先生に理由を聞いてください。 真意がわからないうちは、鵜呑みしないことです。 doubleとfloatでは、精度が違い、そのためメモリに占める大きさも違います。 また、一般的には、桁が多いとその分計算時間がかかります。 ですから、精度が必要ない場面では、floatを使う、というのも一つの考えかたです。 ですが、実際には「一概に言えない、処理系依存」です。 しかし、最近では浮動小数点演算専用の回路が付いているケースが多く、計算時間は同じだったり、doubleに変換が必要でその分floatの方が遅かったり、floatでの演算はより高速... sty を使った場合 H 指定のときに図表を配置するのに十分なスペースがなければ ごっそりアキがあきます here. styの定義する H 指定は 単に「フロート扱いをやめてそこにおく」というだけです A ベストアンサー なぜJPEGなどの画像圧縮で、DCTといった周波数領域への変換を行うかというと、人間の眼は「低周波成分の変化には敏感」だが、「高周波成分ほど変化に鈍感になる」という特性があるからです。 そのため、DCT変換後の周波数領域で、高周波成分の精度を落としても、 視覚上はあまり情報が劣化しているように感じない、ということになるのです。 ここで重要なのは「精度を落とす」のであって「無視する」のではないことに注意してください。 結果として、元々の高域成分が非常に小さい場合は、高域成分が0になってしまうことになりますが、「高次の項を無視」するのは、あくまで結果です。 高域成分も大きいような画像だと、JPEGでも高域成分は残ります。 次に、周波数領域への変換方法で、なぜフーリエ変換ではなくDCT変換なのかというと、 フーリエ変換では、入力が実数の場合でも、変換後の周波数領域成分が「複素数」になってしまいますが、 DCTでは、入力が実数なら、変換後の周波数領域成分も「実数」になるので、計算が容易になるからです。 なお、このDCT変換後の周波数領域での「DC成分とは何か」ですが、 DC成分とは、対象としているブロック全体の「平均輝度」を表しています。 例えば、全体的に真っ白な画像は、DCT変換すると、DC成分が1で、それ以外の周波数成分は全て0になります。 全体に真っ黒な画像は、DC成分も0で、それ以外の周波数成分も0です。 DC成分が失われるということは、この「平均輝度」情報が無くなるということですので、 DC成分無しではまともに「画像」情報を処理することが出来ないのです。 なぜJPEGなどの画像圧縮で、DCTといった周波数領域への変換を行うかというと、人間の眼は「低周波成分の変化には敏感」だが、「高周波成分ほど変化に鈍感になる」という特性があるからです。 そのため、DCT変換後の周波数領域で、高周波成分の精度を落としても、 視覚上はあまり情報が劣化しているように感じない、ということになるのです。 ここで重要なのは「精度を落とす」のであって「無視する」のではないことに注意してください。 A ベストアンサー こんばんは。 取りあえず読み込み元がDIB24bit前提と言う事で。 グレースケールに変換しながら計算しています。 全てを9で割って足さず、全て足してから9で割っています。 若しかしたら、間違っているかもしれませんが、其処は御勘弁下さい。 Q 画像処理のチェーンコードが上手くいきません。 言語はC です。 下のようにやってますが、どこかで上手くいっていないみたいです。 間違いの指摘をおねがいします。 あるいは、画像処理のチェーンコードのサンプルコードのあるサイトを教えてもらえると助かります。 言語はメジャーなものならなんでもかまいません。 言語はC です。 下のようにやってますが、どこかで上手くいっていないみたいです。 間違いの指摘をおねがいします。 あるいは、画像処理のチェーンコードのサンプルコードのあるサイトを教えてもらえると助かります。 言語はメジャーなものならなんでもかまいません。 nifty. サンプルプログラムの注意点として、switch~caseのFall Through わざとbreakを置かずに、あるcaseを実行後そのまま次のcaseを実行するようにする を利用しているので、そのままC で使えません コンパイルエラーになります。 case A: の前の行に goto case A; を入れてください Aは0,1,... nifty.

次の

ヒストグラム その2: ヒストグラム平坦化 — OpenCV

ヒストグラム 平坦 化

明るい画像では明度の分布は明るい方に集中しており、暗い画像では明度は暗い方に集中しています。 この明度の分布 を広げて明るさをまんべんなくする方法が平坦化で、画像のスト調整ができます。 ではメソッドcv2. equalizeHist を使うことで実現可能です。 引数となるには色空間のV ・明度を用い、明度のを平坦化します。 画像が全体的に明るい場合や全体的に暗い場合はが特定の範囲に偏っているため平坦化 を広げる が有効ですが、元の画像のが特定の範囲に偏っていないなど、平坦化があまり有効ではない 広げられない 場合があります。 スト制限付適応平坦化 CLAHE は領域ごとに平坦化をする方法で、画像全体の分布に影響されません。 ではメソッドcv2. createCLAHE によりCLAHEオブジェクトを生成し、オブジェクト. apply img により、画像imgにCLAHEオブジェクトを適用します。 デフォルトのBGR色空間で各チャンネルそれぞれについて平坦化することも可能ですが、元画像と平坦化後画像のBGR比が変わり、色味が維持されないので、色空間に変換し、明度Vにのみ平坦化を行うことで、色味を維持したままスト補正を行っています。 使った関数・メソッド• cv2. equalizeHist : 平坦化• cv2. createCLAHE : CLAHEオブジェクトの生成 関連記事 環境• windows10 home• 0 平坦化 準備 よりの「」をファイル名'Delacroix. ipynb と同じリに保存しました。 Delacroix. imread 'Delacroix. cvtColor img, cv2. calcHist [hsv],[ 2], None,[ 256],[ 0, 256] plt. calcHist [hsv],[ 2], None,[ 256],[ 0, 256] plt. cvtColor hsv, cv2. jpg',bgr 実行結果 元の明度V値のと平坦化後のV値のが表示されます。 平坦化により明るい方に明度Vの分布が広がっていることが分かります。 平坦化後の画像が保存されます。 全体的に明るくなり様子がよくわかります。 jpg スト制限付適応平坦化 準備 から夕日の写真をファイル名'sunset. ipynb と同じリに保存しました。 sunset. jpg まずは平坦化を試します。 imread 'sunset. cvtColor img, cv2. calcHist [hsv],[ 2], None,[ 256],[ 0, 256] plt. calcHist [hsv],[ 2], None,[ 256],[ 0, 256] plt. cvtColor hsv, cv2. jpg',bgr 実行結果 平坦化により明るい方に明度Vの分布が広がっていることが分かります。 暗い部分が明るくなり、様子が分かるようになります。 続いて、スト制限付適応平坦化を試します。 imread 'sunset. cvtColor img, cv2. calcHist [hsv],[ 2], None,[ 256],[ 0, 256] plt. calcHist [hsv],[ 2], None,[ 256],[ 0, 256] plt. cvtColor hsv, cv2. jpg',bgr 実行結果 明度V30程度の画素が最も多かったのが、平坦化により明度V130あたりが最も多い画素となりました。 雲の形や岸壁のストが大きくなり、平坦化よりも、CLAHEの方がよりスト補正がうまくいっていることが分かります。

次の