• 検索結果がありません。

目次 1 はじめに 1 2 グレースケール 2 3 ヒストグラム 3 4 累積ヒストグラム 4 5 ヒストグラム平坦化 7 6 RAW 画像 9 7 他の画像 12 8 エントロピ 16 9 まとめ 18 使用したツール 19 参考文献

N/A
N/A
Protected

Academic year: 2021

シェア "目次 1 はじめに 1 2 グレースケール 2 3 ヒストグラム 3 4 累積ヒストグラム 4 5 ヒストグラム平坦化 7 6 RAW 画像 9 7 他の画像 12 8 エントロピ 16 9 まとめ 18 使用したツール 19 参考文献"

Copied!
21
0
0

読み込み中.... (全文を見る)

全文

(1)

2015 年度 卒業研究論文

画像のヒストグラム平坦化について

岡山理科大学

総合情報学部 情報科学科

I12I005 石岡里奈

I12I013 大玉優菜

(2)

目次

1 はじめに・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・1 2 グレースケール・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・2 3 ヒストグラム・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・3 4 累積ヒストグラム・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・4 5 ヒストグラム平坦化・・・・・・・・・・・・・・・・・・・・・・・・・・・・・7 6 RAW画像・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・9 7 他の画像・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・12 8 エントロピ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・16 9 まとめ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・18 使用したツール・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・19 参考文献

(3)

1

1 はじめに

デジタルカメラで撮影したとき,領域毎の明るさの差によって,画像中の一部が薄暗い, または明るすぎて見づらくなることがある.また,光の量が少ないと画像全体が暗めにな り黒つぶれになり,光の量が多いと画像全体が白くなり白とびを起こしてしまう.白とび とは,階調番号で言うと例えば255 が上限となり,本来像が写っているべき部分が白くな ってしまった箇所のことをいう.黒つぶれとは,それとは逆に暗すぎて写真に写らなかっ た部分である.階調番号で言うと0 であり,像が写っているべき部分が真っ黒くなってし まうことをという. このような画像を見やすくきれいにするためには,処理しようとする画像の値がどのよ うになっているかを知る必要がある.ここでは画像のヒストグラムに注目する. ヒストグラムとは,画像の各濃淡レベルについて,横軸に濃淡レベル,縦軸に同一濃淡 レベルの画素数をとったグラフである.ヒストグラム中の山になっている部分が左に偏っ ていると暗い画像,右の場合は明るすぎる画像,中心に集中しているとコントラストの低 い画像になる.ヒストグラムは,一部のデジタルカメラやフォトレタッチソフトでは普通 に見ることができ,画像の品質を確認,調整する際に用いることがある.ここでは,画像 の補正はトーンカーブを用いることにする.トーンカーブは画像を階調補正するツールで 主要な役割を果たすものと考えられることにする. 本研究では画像のヒストグラムを用いて階調補正を行い,トーンカーブの差異も比較す る.また,bit 数の異なる画像を用意し,bit 数により結果にどのような違いが表れるのか も検証する. 比較用の原画像としては,SONY 社のα7R デジタルカメラを使用して当研究室で撮影し た,岡山理科大学の風景写真(24bit 画像(JPEG)と 14bitRAW データ)を用いる. 以降,この岡山理科大学の風景写真をtypeA と表記する(図 1).

(4)

2

2 グレースケール

画像を構成する最小要素のことを画素(pixel=ピクセル)という.それぞれの画素は数値 によって輝度や色の強度を表している.そして,各画素のこのような値を画素値といい, 画像は画素値が多値か単位であるかにより,カラー画像(RGB の 3 値),グレースケール 画像(単値)などの種類に分かれている.RGB カラー画像に対して,白黒の濃淡を数値で 表現した画像をグレースケール画像という.グレースケール画像は,コンピュータ上での 画像の表現方法の一つであり,色の情報は含まない「モノクロ」画像のことである.一般 的にグレースケール画像では,1 画素を 8 ビットで表し,符号無し 8 ビット整数を用いるこ とにより,濃淡を256 階調で表しており,一般に,画素値 0 が黒,画素値 255 が白となる. 画素値を表現するために用いるデータ長が16 ビットなら 65536 階調のグレースケールを区 別して表現することができる. カラー画像からグレースケール画像を得るための変換は,いくつか方法がある. ・NTSC の式(式 1)を用いる(図 1) ・OpenCV のカラー変換関数(cvtColor)を用いる ・原画像読み取り時にOpenCV の関数を用いる 本研究では,NTSC の式を用いてグレースケール変換を行った画像を使用している〔1〕. NTSC 加重平均法とは,R 要素値,G 要素値,B 要素値の一つだけ抽出するのではなく, 三つの値の平均を取る方法である.ただし,単純に値R+G+B を 3 で割って平均値えお求め 変換した画像は,元のカラー画像とは違和感のあるものとなる.これは,人間の目では緑 色の明るさの変化はよくわかるが,青色の明るさの変化には鈍感だというように,色合い によって明るさの感じ方が違うからである.よって,今回は,人間の目に違和感無く変換 するために,それぞれの値に一定の重み付けをし(三つのRGB 値の割合を決めて)その値 を用いてグレースケール変換した画像を用いる.この重み付けの係数(NTSC cofficients) は,日本やアメリカのテレビ放送で利用されている規格のものと同じである. NTSC の式は以下のようになる. Y=0.298912*R+0.586611*G+0.114478*B・・・(式 1)

(5)

3 図2 8bit グレースケール画像(typeA)

3 ヒストグラム

画像を見やすくするためには,画像のヒストグラムの値を基準に調整するのがよい. ヒストグラムとは,画像全体で同じ値を有する画素数の個数を求め,頻度分布として表 すようグラフ化したものである.ヒストグラムは横軸に濃淡レベル,縦軸に同一濃淡レベ ルの画素数をグラフにしている.ヒストグラムが左に偏っていると暗い画像,右の場合は 明るすぎる画像,中心に集中しているとコントラストの低い画像になる.一部のデジタル カメラやフォトレタッチソフトで利用することができ,画像の品質を確認,調整する際に 用いることもある. ヒストグラムを平坦化したり拡張したりすることにより,画像のコントラストを補正する ことで,画像を見やすくすることができる. カラー画像ではRGB それぞれに対してヒストグラムがある(図 3).また,グレースケ ール画像(図2)に関しては単一のヒストグラムが得られる(図 4)〔2〕〔3〕. ヒストグラム補正による画像の改善は,グレイスケール画像に関しては非常に効果があ るが,カラー画像でRGB 毎に補正すると色相のズレの問題が発生する.たとえば,カラー 画像にグレイの部分があったすると,このピクセルにおいては,RGB 各成分は同じである. しかし,画像の他の部分に赤色の濃い部分があると,相対的にR は低い値となり,コント ラスト増強のためにR 成分が抑えられ,シアンがかった色に変わってしまう.そのため本 研究では,色相のズレの派生しないグレースケール画像に関するヒストグラムを用いるこ とにする(図4).

(6)

4 図3 原画像ヒストグラム(RGB)(typeA) 図 4 ヒストグラム(typeA)

4 累積ヒストグラム

累積ヒストグラムとは,ヒストグラムに関し,値を最初の値から最後の値までを累積計 算したものであり右肩上がりの棒グラフのようなる(図5). また,以下で累積ヒストグラムとヒストグラムの関係を図とプログラムを使って説明す る. 図5 累積ヒストグラム(typeA)

(7)

5 図6 配列(typeA) 上がヒストグラムを表す配列A で,下が累積ヒストグラムを表す配列 B である(図 6). まず,A の 0 番目の値を B の 0 番目の値に入れる.次に,B の 1 番目の値は B の 0 番目 の値とA の 1 番目の値を足したものである.順に B の 2 番目の値は B の 1 番目の値と A の2 番目の値を足したものである.同様に 255 番目の配列まで足す. このB の配列に入った値をグラフにしたものが累積ヒストグラムである. 以下にヒストグラムと累積ヒストグラムを生成するプログラムを示す(図7).

int x, y; uchar r1, g1, b1, d; Vec3b color1;

int width = image1.cols; int height = image1.rows; Mat image2 = Mat(Size(width, height), CV_8UC1); for (y = 0; y < height; y++){

for (x = 0; x < width; x++){

color1 = image1.at<Vec3b>(y, x); r1 = color1[2]; g1 = color1[1];b1 = color1[0]; //RGB 値をグレイスケール化

d = saturate_cast<uchar>(0.299 * r1 + 0.587 * g1 + 0.114 * b1); //ピクセル値を設定

image2.at<uchar>(y, x) = d; } } //ヒストグラムを採る

int i; int img_hist[256];

for (i = 0; i < 256; i++){ img_hist[i] = 0; } for (y = 0; y < image2.rows; y++){

for (x = 0; x < image2.cols; x++){d = image2.at<uchar>(y, x); img_hist[d]++; } } //累積ヒストグラムをとる

int img_ahist[256]; img_ahist[0] = img_hist[0];

for (i = 1; i < 256; i++){ img_ahist[i] = img_ahist[i - 1] + img_hist[i]; } //ヒストグラムの最大値を求める

(8)

6 int img_hist_max = 0;

for (i = 0; i<256; i++){

if (img_hist[i]> img_hist_max) img_hist_max = img_hist[i]; } //累積ヒストグラムの最大値を求める

int img_ahist_max = img_ahist[255]; //ヒストグラムの最大値で正規化する float img_histf[256];

for (i = 0; i < 256; i++){ img_histf[i] = img_hist[i] / (float)img_hist_max; } //累積ヒストグラムの最大値で正規化する

float img_ahistf[256];

for (i = 0; i < 256; i++){ img_ahistf[i] = img_ahist[i] / (float)img_ahist_max; } //ヒストグラムを描く

Mat hist_image = Mat(Size(276, 140), CV_8UC1, Scalar(255, 255, 255)); rectangle(hist_image, Point(10, 20), Point(265, 120), Scalar(220, 220, 220), -1); for (i = 0; i < 256; i++){

line(hist_image, Point(10 + i, 120), Point(10 + i, 120 - (int)(img_histf[i] * 80)), Scalar(50, 50, 50), 1, 8, 0); }

//累積ヒストグラムを描く

Mat hist_image2 = Mat(Size(276, 140), CV_8UC1, Scalar(255, 255, 255)); rectangle(hist_image2, Point(10, 20), Point(265, 120), Scalar(220, 220, 220), -1); for (i = 0; i < 256; i++){

line(hist_image2, Point(10 + i, 120), Point(10 + i, 120 - (int)(img_ahistf[i] * 80)), Scalar(50, 50, 50), 1, 8, 0); }

(9)

7

5 ヒストグラム平坦化

累積ヒストグラムを用いてヒストグラム平坦化を行う.ヒストグラム平坦化とは,ヒス トグラムの幅を調整し平坦にすることで画像の明暗を分かりやすくする方法である. ここでは累積ヒストグラムのx 軸の値を y 軸の値にすることで処理後の画像に関するト ーンカーブを直線にしている.トーンカーブは,グラフ上で横軸が元の明るさ(入力値) であり,縦軸が変更後の明るさ(出力値)である.変更前は入力と出力が同一のため45 度 に傾いた直線になる.この線をカーブ状に変形させることにより,RGB の階調を調整する ことにより画像の明るさ,コントラスト等を補正することにより,画像を見やすくするこ とが出来る. 次に,今回用いた平坦化の変換法を説明する(図8).累積ヒストグラムを用いて x 軸の 値をy 軸の値に変えると,処理後の画像に関するトーンカーブが直線になる. 図8 トーンカーブ 実際に8bit グレースケール画像(図 2)をヒストグラム平坦化した画像を示す(図 9). 図9 平坦化後の画像(typeA) 図 10 平坦化後の累積ヒストグラム(typeA)

(10)

8 8bit グレースケール画像(図 2)とヒストグラム平坦化後の画像(図 9)を比べると平坦 化後の画像はコントラストが強調され,見やすくなっていることがわかる.また,平坦化 後の累積ヒストグラム(図10)が直線になっていることからも平坦化後の画像が見やすく きれいになっていることが分かる. ヒストグラム変換テーブル作成手順は以下のようになる(図11). //変換テーブルの作成

uchar img_table[256]; float integervalue; img_table[0] = 0; for (i = 1; i < 256; i++){

integervalue = 255 * img_ahistf[i]; img_table[i] = (int)integervalue; }

int r3, g3, b3, d3, r4, g4, b4; Vec3b color3; Mat image3 = imread("画像ファイル名"); Mat image4 = Mat(Size(width, height), CV_8UC1);

for (y = 0; y < height; y++){

for (x = 0; x < width; x++){ color3 = image3.at<Vec3b>(y, x); r3 = color3[2]; color3[2] = img_table[r3]; r4 = color3[2]; g3 = color3[1]; color3[1] = img_table[g3]; g4 = color3[1]; b3 = color3[0]; color3[0] = img_table[b3]; b4 = color3[0]; image3.at<Vec3b>(y, x) = color3; //RGB 値をグレイスケール化 d3 = saturate_cast<uchar>(0.299 * r4 + 0.587 * g4 + 0.114 * b4); //ピクセル値を設定 image4.at<uchar>(y, x) = d3; } } 図11 変換テーブルの作成手順

6 RAW 画像

bit 数の異なる画像で比較するために,当研究室で撮影した RGB 各 14bit 計 42bit の RAW データ(RAW 画像とする)を使用する.RAW 画像とは,デジタルカメラなどにおいて完 成状態とはされていない画像データのことである.デジタルカメラでは一般的にJPEG 画 像を生成するが,RAW 画像はこの JPEG 画像を生成する元となる生の画像データである. 写真知識があるユーザーが,明度,彩度などの補正や加工,ノイズや歪曲など除去をパソ コン上で思い通りに行ないたいという要望に応え,カメラメーカーが用意しているデータ 形式のひとつである.まず,42bit の RAW 画像(図 11)をグレースケール化し,その画像 (図12)を RAW 画像を 8bit にした画像(図 13)にしてヒストグラムを計算する(図 15). ヒストグラム平坦化を行った画像(図14)と累積ヒストグラム(図 16)は以下の画像のよ うになる.

(11)

9

図11 42bitRAW 画像(TIFF)(typeA) 図 12 14bit グレースケール画像(typeA)

図13 8bit 画像(typeA) 図 14 平坦化後の画像(typeA)

図15 累積ヒストグラム(typeA) 図 16 平坦化後の累積ヒストグラム(typeA)

先に示した8bit 画像(図 9)と同様にヒストグラム平坦化後の画像(図 14)のコントラ ストが強調され,平坦化前の累積ヒストグラム(図15)と比較すると平坦化後の累積ヒス トグラム(図16)がきれいな直線になっていることが分かる.

(12)

10

RAW 画像から累積ヒストグラムを求めるプログラムは以下のようになる(図 17).

int x, y, aint; unsigned short r1, g1, b1; unsigned short image2_16, image2_16c; unsigned short a = 0; double d, c; Vec3s color1;

int width = image1.cols; int height = image1.rows; Mat image2 = Mat(Size(width, height), CV_16UC1); Mat image3 = Mat(Size(width, height), CV_16UC1); Mat image4 = Mat(Size(width, height), CV_8UC1); for (y = 0; y<height; y++){

for (x = 0; x<width; x++){

color1 = image1.at<Vec3s>(y, x);

r1 = color1[2]; g1 = color1[1]; b1 = color1[0]; //グレースケール化 d = saturate_cast<double>(0.299 * r1 + 0.587 * g1 + 0.114 * b1); image2_16 = saturate_cast<ushort>(d); //コントラスト変換 c = (65535 * sqrt(d / 65535.)); image2_16c = saturate_cast<ushort>(c); //ピクセル値を設定 image2.at<ushort>(y, x) = image2_16; image3.at<ushort>(y, x) = image2_16c; //16bit を 8bit に変換 image4.at<uchar>(y, x) = saturate_cast<uchar>(image2_16 / 256.0); } } //ヒストグラムを採る

int i; int img_hist[256];

for (i = 0; i<256; i++){ img_hist[i] = 0; } for (y = 0; y<image4.rows; y++){

for (x = 0; x<image4.cols; x++){ a = image4.at<uchar>(y, x); aint = a;

img_hist[aint]++; } } //累積ヒストグラムをとる

int img_ahist[256]; img_ahist[0] = img_hist[0];

for (i = 1; i<256; i++){ img_ahist[i] = img_ahist[i - 1] + img_hist[i]; } //ヒストグラムの最大値を求める

(13)

11 for (i = 0; i<256; i++){

if (img_hist[i]> img_hist_max) img_hist_max = img_hist[i]; } //累積ヒストグラムの最大値を求める

int img_ahist_max = img_ahist[255]; //ヒストグラムの最大値で正規化する float img_histf[256];

for (i = 0; i<256; i++){

img_histf[i] = img_hist[i] / (float)img_hist_max; } //累積ヒストグラムの最大値で正規化する

float img_ahistf[256];

for (i = 0; i<256; i++){ img_ahistf[i] = img_ahist[i] / (float)img_ahist_max; } //ヒストグラムを描く

Mat hist_image = Mat(Size(276, 140), CV_8UC1, Scalar(255, 255, 255)); rectangle(hist_image, Point(10, 20), Point(265, 120), Scalar(220, 220, 220), -1); for (i = 0; i<256; i++){

line(hist_image, Point(10 + i, 120), Point(10 + i, 120 - (int)(img_histf[i] * 80)), Scalar(50, 50, 50), 1, 8, 0); }

//累積ヒストグラムを描く

Mat hist_image2 = Mat(Size(276, 140), CV_8UC1, Scalar(255, 255, 255)); rectangle(hist_image2, Point(10, 20), Point(265, 120), Scalar(220, 220, 220), -1); for (i = 0; i<256; i++){

line(hist_image2, Point(10 + i, 120), Point(10 + i, 120 - (int)(img_ahistf[i] * 80)), Scalar(50, 50, 50), 1, 8, 0); }

//変換テーブルの作成

uchar img_table[256]; float integervalue; img_table[0] = 0; for (i = 1; i<256; i++){

integervalue = 255 * img_ahistf[i]; img_table[i] = (uchar)integervalue; }

unsigned short r5, g5, b5; unsigned short image6_16; double d6; int d8 = 0; Vec3s color5;

Mat image5 = imread("koji-1.tif",

CV_LOAD_IMAGE_COLOR|CV_LOAD_IMAGE_ANYDEPTH); Mat image6 = Mat(Size(width, height), CV_16UC1);

Mat image8 = Mat(Size(width, height), CV_8UC1); int color8;

(14)

12 for (x = 0; x<width; x++){

color5 = image5.at<Vec3s>(y, x); r5 = color5[2]; g5 = color5[1]; b5 = color5[0]; //グレースケール化 d6 = saturate_cast<double>(0.299 * r5 + 0.587 * g5 + 0.114 * b5); image6_16 = saturate_cast<ushort>(d6); //ピクセル値を設定 image6.at<ushort>(y, x) = image6_16; //16bit を 8bit に変換 image8.at<uchar>(y, x) = saturate_cast<uchar>(image6_16 / 256.0); //変換 8bit グレイスケールヒストグラム color8 = image6.at<ushort>(y, x) / 256; image8.at<uchar>(y, x) = img_table[color8]; } } 図17 RAW 画像から平坦化した画像を求める作成手順

7 他の画像

画像を取り替えて今までとtypeA と同様の処理を行った場合の比較を行う.

この項目では,岡山理科大学の工事現場の写真として(24bit 画像(JPEG), 14bitRAW データ)を用いる.以降では,岡山理科大学の工事写真をtypeB と表記する(図 18).

typeA で行った処理と同様に,24bit 画像(図 18)をグレースケール化し,その画像(図 19)のヒストグラムを計算する(図 20,21).ヒストグラム平坦化を行った画像(図 22) と累積ヒストグラム(図24)は以下の画像のようになる.

(15)

13

図19 8bit グレースケール画像(typeB)

図20 ヒストグラム(typeB) 図 21 累積ヒストグラム(typeB)

(16)

14 図24 平坦化後の累積ヒストグラム(typeB) 先に示したtypeA と同様にヒストグラム平坦化後の画像(図 22)のコントラストが強調 され,平坦化前の累積ヒストグラム(図21)と比較すると平坦化後の累積ヒストグラム(図 24)が直線に近づいていることが分かる. RAW 画像に関し,typeA と同様の処理を行った結果を以下に示す.

まず,42bit の RAW 画像(図 25)をグレースケール化し,その画像(図 26)を RAW 画 像を8bit にした画像(図 27)にしてヒストグラムを計算する(図 28,29).ヒストグラム 平坦化を行った画像(図30)と累積ヒストグラム(図 31)は以下の画像のようになる.

(17)

15

図26 14bit グレースケール画像(typeB)

図27 RAW 画像を 8bit にした画像(typeB)

(18)

16 図30 平坦化後の画像(typeB) 図31 平坦化後の累積ヒストグラム(typeB) こちらも,先に示したtypeA と同様にヒストグラム平坦化後の画像(図 30)のコントラ ストが強調され,平坦化前の累積ヒストグラム(図29)と比較すると平坦化後の累積ヒス トグラム(図31)が直線になっていることが分かる.

8 エントロピ

エントロピ(entropy)とは画面全体に関する平均情報量である.画像に関する 1 画素あ たりの情報量を表す指標として使われる.ここではグレースケール画像に関するエントロ ピを用いて比較を行う. エントロピの計算式は以下のようになる(式2).全画素数を𝑁とし,画素値 i の画素数 を𝑁𝑖とすれば𝑝𝑖= 𝑁𝑖⁄ ,𝑝𝑁𝑖 𝑖≠ 0についてのみ計算する.

H = − ∑ 𝑝

𝑖

𝑙𝑜𝑔

2

𝑝

𝑖 ビット/画素・・・(式2)

8bit グレースケール画像と RAW 画像を 8bit にした画像に関しエントロピを計算した結 果は以下のようになる.

(19)

17

(1)8bit グレースケール画像のエントロピ(typeA) ・平坦化前の画像 ・・・ 7.763 bit

・平坦化後の画像 ・・・ 7.964 bit

(2)RAW 画像を 8bit にした画像のエントロピ(typeA) ・平坦化前の画像 ・・・ 7.757 bit

・平坦化後の画像 ・・・ 7.610 bit

(3)8bit グレースケール画像のエントロピ(typeB) ・平坦化前の画像 ・・・ 7.726 bit

・平坦化後の画像 ・・・ 7.901 bit

(4)RAW 画像を 8bit にした画像のエントロピ(typeB) ・平坦化前の画像 ・・・ 7.725 bit

・平坦化後の画像 ・・・ 7.561 bit

エントロピの計算を求めるプログラムは以下のようになる(図32).

//平坦化前の画像のエントロピの計算

double ep1; double eep1 = 0; double ep2; double ep3 = 0; double ep4;

for (i = 0; i < 256; i++){ ep1 = img_hist[i] / (float)img_ahist_max; eep1 += ep1; if (img_hist[i] != 0){ ep2 = -ep1*log(ep1); ep3 += ep2; }

printf("%.7f %.7f¥n", ep1, eep1); }

ep4 = ep3 / log(2.0); printf("¥n %.7f ¥n¥n", ep4); //平坦化後の画像のエントロピの計算

double ep5; double eep2=0; double ep6; double ep7=0; double ep8;

for (i = 1; i < 256; i++){ ep5 = img_hist2[i] / (float)img_ahist_max2; eep2 += ep5; if (img_hist2[i]!=0){ ep6 = -ep5*log(ep5); ep7 += ep6; }

printf("%.7f %.7f¥n", ep5,eep2); }

ep8 = ep7/log(2.0); printf("¥n %.7f ¥n",ep8);

図32 エントロピの計算プログラム また,RAW 画像を 8bit に変換せずに求めたエントロピは以下のようになる. (5)14bit グレースケール画像のエントロピ(typeA) ・平坦化前の画像 ・・・ 15.628 bit ・平坦化後の画像 ・・・ 15.440 bit (6)14bit グレースケール画像のエントロピ(typeB) ・平坦化前の画像 ・・・ 15.597 bit ・平坦化後の画像 ・・・ 15.399 bit さらに,RAW 画像を 8bit に変換せずに求めたプログラムは以下のようになる(図 33).

(20)

18 //ヒストグラム変換 16bit.version

int img_ahist16[65536];img_ahist16[0] =0; for (i = 1; i < 65536; i++){

img_ahist16[i] = img_ahist16[i-1]+ img_hist16[i]; } for (i = 1; i < 65536; i++){

img_ahist16[i] =(int)( 65535.*(double)img_ahist16[i]/ (double)img_ahist16[65535]); } Mat image2_contrast = Mat(Size(width, height), CV_16UC1); int gray_contrast;

for (y = 0; y<height; y++){ for (x = 0; x<width; x++){

gray_contrast = image2.at<ushort>(y, x);

image2_contrast.at<ushort>(y, x)= img_ahist16[gray_contrast]; } } //平坦化後の画像のヒストグラムを採る(16bit)

for (i = 0; i<65536; i++){ img_hist16[i] = 0;} for (y = 0; y<image2_contrast.rows; y++){

for (x = 0; x<image2_contrast.cols; x++){ a = image2_contrast.at<ushort>(y, x); aint = a; img_hist16[aint]++; } } //平坦化後の画像のエントロピーの計算(16bit) ep3 = 0; for (i = 0; i < 65536; i++){

ep1 = img_hist16[i] / (float)(image2_contrast.rows*image2_contrast.cols); if (img_hist16[i] != 0) { ep3 += -ep1*log(ep1); } }

ep4 = ep3 / log(2.0); printf("変換後 16 ビット画像のエントロピ ¥n %.7f ¥n¥n", ep4); 図33 エントロピの計算プログラム

9 まとめ

本研究をまとめると,JPEG 画像と RAW 画像どちらに関しても,グレースケール画像と ヒストグラム平坦化を行った画像を比較すると,平坦化後の累積ヒストグラムが直線にな っており,コントラストが強調されていることからも,画像が見やすくなっていることが 分かる. また,ヒストグラム平坦化後のJPEG 画像のエントロピは増加しており,RAW 画像の場 合は減少している.エントロピは増加することはないため,色相成分に誤差の含まれてい るJPEG 画像よりも RAW 画像に関して処理する方が計算誤差の影響の少ないことが分か る. さらに,RAW 画像を 8bit に変換せずに求めたエントロピは平坦化前の画像より平坦化後

(21)

19 の画像の方がエントロピが減少している.それは,カメラ側で14bit の画像を生成記録する ときに計算誤差が入ったり,見かけ上増えたと思われる.

使用したツール

・VisualStudio2012(言語 C++) ・OpenCV 2.4.9 ・Image J

・Image Data Converter Ver. 4

参考文献

[1] OpenCV を Visual Studio で使う方法

http://physics-station.blogspot.jp/2013/03/opencv-visual-studio.html [2]OpenCV と Visual C++ による画像処理と認識

http://homepage3.nifty.com/ishidate/vcpp.htm

図 1  画素あたり 24bit の原画像(JPEG)(typeA)
図 11  42bitRAW 画像(TIFF) (typeA)    図 12  14bit グレースケール画像(typeA)
図 18  24bit 画像(JPEG)(typeB)
図 19  8bit グレースケール画像(typeB)
+4

参照

関連したドキュメント

S63H元 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0 1000 2000 3000 4000 5000 6000 清流回復を実施した発電所数(累計)

6-4 LIFEの画面がInternet Exproler(IE)で開かれるが、Edgeで利用したい 6-5 Windows 7でLIFEを利用したい..

このような環境要素は一っの土地の構成要素になるが︑同時に他の上地をも流動し︑又は他の上地にあるそれらと

画像 ノッチ ノッチ間隔 推定値 1 1〜2 約15cm. 1〜2 約15cm 2〜3 約15cm

撮影画像(4月12日18時頃撮影) 画像処理後画像 モックアップ試験による映像 CRDレール

1月中に企画概要をきめ、2月にクラウドファンディングスタート、3月には告知開始くらい

1月 2月 3月 4月 5月 6月 7月 8月 9月10月 11月 12月1月 2月 3月 4月 5月 6月 7月 8月 9月10月 11月 12月1月 2月 3月.

4月 5月 6月 7月 8月 9月 10月 11月 12月 1月 2月