2016年3月9日水曜日

OpenCvでコントラスト調整

OpenCvSharpでコントラストを調整したいのでググったが、どうやらできないみたい。

ゴリラになる知識: コントラスト調整

ということでCv.Scaleを使って調整してみた。
まず256の範囲で獲得したヒストグラムをbins[]に突っ込んでおく。そしてminに一番暗い輝度を、maxに一番明るい輝度を設定する。今回はminを0に、maxを255に近づけるような処理を行う。

int min = 0, max = bins.Length - 1;

for (int i = 0; i < bins.Length; i++)
{ if (bins[i] > 0) { min = i; break; } }

for (int i = bins.Length - 1; i >= 0; i--)
{ if (bins[i] > 0) { max = i; break; } }

float scale = 256f / (max - min);
float shift = -min * scale;

Cv.Scale(img2, img2, scale, shift);

Cv.ScaleではSrc, Dst, Scale, Shiftを引数に渡す。処理としてはまずScaleでn倍に拡張し、その後でShiftを加算している。コントラストを調整したい場合はminとmaxの差が256になるようにScaleで拡張する。その後にShiftでminを0に近づけたいわけだが、minもScaleでn倍にされているので、引数に渡すShiftもscaleでn倍にして渡す。

結果


上が入力画像、下がコントラスト調整後の画像。左がカラー、右がグレースケールの画像となる。グレースケールはカラーをグレースケールに変換した後にコントラストを調整している。調整の係数はグレースケールのヒストグラムをカラーにも使用した。


ということでコントラストの調整は結構簡単にできるっぽい。ただ自動でコントラストを拡張したい場合は予めヒストグラムを獲得しておく必要がある。OpenCvのヒストグラム獲得は結構面倒なので、そのあたりが面倒。

カラーのコントラストを単純に調整すると色味に違和感が出る気がする。まぁこれは見る人の問題なのでそこら辺は好きにいじるように。

0 件のコメント:

コメントを投稿