累乗則変換を考慮したHSV変換とMATLAB
前回、超絶適当に画像処理しましたが、すこしシミュレーションも交え真面目にやってみる事にしました。
画像データ、とりわけトゥルー・カラーには多くの情報がおさめられているので、用途に応じて適切な画素処理または画像強調処理を施します。例えば圧縮処理や特徴点から画像の相似性を求めるには近傍処理(マスク処理、フィルタ処理)を行います。
音声信号圧縮でも同様ですが、この強調処理には大別して空間領域と周波数領域での処理のいずれかを行うことになります。
今回は画像の円錐型HSV空間に含まれる色相を読み取りたいので、それ以外のベクトル—輝度か彩度—を調整します。
HSV空間はこのように図示できます。
輝度値を調整する画素処理では、xを入力輝度、yを出力輝度、Tを伝達関数とする際、
と表せます。問題は伝達関数の次元や、線形性です。
■累乗則変換
入力・出力輝度の変域、値域を[0 1]に定める*1と、累乗則変換は
とあらわすことができます。変域が[0 1]であることを考えると
:暗部の明化
:明部の暗化
となります。MATLABを使い前回の画像をHSV変換したのちVベクトルのみを調整してみました。
MATLABではimread関数で画像データから3次元の空間行列が得られます。
picRGB = imread("hoge.jpg");
とすると
picRGB([行座標],[列座標],[1:Red|2:Green|3:Blue]);
の次元で配列されます。
ちなみに
picHSV = rgb2hsv(picRGB);
とすると、HSV空間も
picHSV([行座標],[列座標],[1:Hue|2:Saturation|3:Value]);
になります。
というわけで、今回はV(輝度)の値のガンマ値を0.2にしてみました。ガンマ値の補正はMATLABではimadjust関数があるので特別に計算ルーチンを作る必要はこの場合はありません。
% \Gamma Gamma = 0.2; % 画像データオープン picRGB = imread('hoge.jpg'); % V成分を累乗則変換 picHSV = rgb2hsv(picRGB); picHSV(:,:,3) = ... % V空間のみ変更 imadjust(picHSV(:,:,3),[],[],Gamma); picRGBHSV = hsv2rgb(picHSV); % 画像の表示 figure(1); imshow(picRGB); title('元イメージ'); figure(2); imshow(picRGBHSV); title('V成分を累乗則変換');
こんなかんじかな。
今日はここまで。
あと、ヒストグラムを出さないと…
◆参考文献
- interface 2011年12月号
*1:次元は同じなので両方とも正規化できる