通常、ディスプレイは非線形の明るい応答を示します。たとえば、フレーム バッファー値を 100 にすると、値 200 の半分の明るさが得られることはほとんどありません。歴史的に、これはCRTモニターの物理学によるものですが、新しいディスプレイテクノロジーはその動作をエミュレートします。これは互換性のためだけでなく、人間の視覚の科学に基づく確固たる理由によるものです。
CRT の非線形性に対する 1 次近似は、次のようになります。
L = ν ^ γ
ここで、Lはディスプレイからの放射輝度(光強度)、νはCRTガンに印加される電圧(通常はフレームバッファのデジタル値に比例)、γ(ギリシャ文字の「ガンマ」)はモニターに固有の定数です。未知のパラメータがすべてを機能させます。通常、約2.0から約2.5の範囲です。有用な事実の 1 つは、ガンマ曲線が対数-対数空間で線形であることです (つまり、logL を logν の関数として表し、γ はその直線の傾きにすぎません。
ガンマ補正の例
点線は線形伝達関数 (γ=1)、フレームバッファのガンマを示します。実線は、一般的な CRT の動作を示しています。破線は逆関数、補正されたガンマを表します。
ガンマ補正は、IPU内のIC(Image Converter)またはDP(Display Processor)サブブロックで行うことができます。Freescale が提供する現在の Linux カーネル (3.10) には、Display Processor ブロック上の関連するガンマ パラメータ レジスタ DP_GAMMA_C_SYNC と DP_GAMMA_S_SYNC を変更する IOCTL があります。
次の手順は、ユーザースペースアプリケーションを使用してガンマを変更する方法を示しています。
1 - 変数を次のように宣言mxcfb_gamma。
構造体mxcfb_gamma fb_gamma;
2 - ガマ補正を有効にします。
fb_gamma.enable = 1;
3 - constk と slopek の値を設定します。ここで、i = 0 から 15 で、x と y はそれぞれ新しい constk と slopek の定数値です。
fb_gamma.constk[i]= x;
fb_gamma.スロープ[i]= y;
4 - フレームバッファ デバイスを開き、MXCFB_SET_GAMMAを呼び出します。
fd_fb = open("/dev/fb0", O_RDWR, 0)
ioctl(fd_fb, MXCFB_SET_GAMMA, &fb_gamma)
上記のコードを実行すると、ガンマ値がすぐに変更されます。
Hi robinsingh,
私が説明したガンマ関数はすべての色を変更しますが、実際には、輝度(Y)のみが影響を受けます。
1つの色だけを変更するには、ディスプレイプロセッサのCSC配列を変更することをお勧めします。また、IOCTL を呼び出すことによって、ユーザー空間で行うこともできます。
このリンクでSWを確認してください。
ユーザー空間から、bの正しさ、コントラスト、彩度、色相、ガンマなど、多くのことを変更できます。
よろしくお願いいたします。
Rogerio
こんにちは著者、
あなたは私を導いてくれますか、私のステップで何が欠けていますか?
私のLCDの赤い色は少しずれています、それは正確には完全な赤のようには見えません。だから私はこのLCDを校正したいと思います。そして、私はそれを行うための提案を探しています:
これがガンマ補正の手順です、私はすでに試しましたが、良い結果は得られませんでした
framebuffer_ex1マスター ·rogeriorps/ipu-examples ·GitHubの
上記のガンマ補正サンプルコードを試しましたが、LCDキャリブレーションがさらに悪くなります。
これが私のプラットフォームとLVDSインターフェースの設定です:[Android4.4カーネル3.10]
LCDパネルは(HX8282 -Source driver / HX8696 -Gate Driver)を使用しています---SPIインターフェースが制御用のパネルから出ていないため、パネルレジスタを設定できません。
====(ドライバー/ビデオ/MXC/mxc_lcdif.c)===================================
静的構造体 fb_videomode lcdif_modedb[] = {
{
/* 液晶 1024x600 @ 60 Hz 、ピクセル clk @ 66MHz */
「HiMAX-WSVGA」、60、1024、600、25000、155、160、8、23、4、4、
FB_SYNC_CLK_LAT_FALL、
FB_VMODE_NONINTERLACED、
0,},
};
===( DTS ファイル ) ===========:
MXCFB1: fb@0 {
compatible = "fsl,mxc_sdc_fb";
disp_dev = "ldb";
interface_pix_fmt = "RGB24";
default_bpp = <24>;/*<24>;*/
int_clk = <0>;
late_init = <0>;
status = "大丈夫";
};
================================================================
問:
1)ガンマ補正にipuサンプルコードを使用しましたが、痛風アレイは次のとおりです。
int gout[16] = {0,2,4,8,16,32,64,96,128,160,192,224,255,255,255,255 }; この設定は私のLCDの色に影響を与えません、私が使用する必要がある私のプロセッサimx6dlのための他の痛風値はありますか、または私はこれらの値をどのように計算しますか、何か提案はありますか?
2)リファレンスマニュアルセクション:38.4.9.6ガンマ補正には、「特定のパネル/ディスプレイに必要なガンマ補正スロープはディスプレイメーカーが提供する必要があります」と記載されていますが、サンプルコードのガンマスロープから訴える値は何ですか?
3)データ形式に関しては、私のLCDはRGBストライプをサポートしています(LCDドキュメントはこれについての良い詳細を提供していません)、そして「RGB24」は合理的な結果で私のために働いています。Android HAL は HAL_PIXEL_FORMAT_RGB_565 .この観点から、IPU色空間変換の観点から見る必要があることはありますか?
4)LCDパネルのキャリブレーションに関する他のポインタまたはリファレンスはありますか?
ありがとうございます
ロビン・シン
OpenGL ES2.0は画像の歪みをフレームバッファに出力します
説明する:
1.下のコンピューターはレンダリングに OpenGL Es2.0 を使用します。
2.チップセレクトシェーダーはガンマ補正を使用しません。cat /dev/fb0 をファイルに保存すると、フレームバッファ内の画像が明らかになります。
3.チップセレクトシェーダーはガンマ補正(ガンマ値は2.2)を使用しています。cat /dev/fb0 でファイルにアクセスすると、フレームバッファ内の画像は元の画像とほとんど変わらず、各ピクセルの成分が1つずつ異なることがわかります。
4.フレームバッファサイズは720pです。ガンマ補正なしのフレームレートは50fps、ガンマ補正ありのフレームレートは20fpsです。テストの結果、フレームレートが低い理由は、プログラムが前面と背面のバッファのスワップ(関数:eglSwapBuffers)に多くの時間を費やしていることが分かりました。
5.質問:
ガンマ補正を使用しないと画像が歪んでしまう
GAMMA 補正を使用すると、eglSwapBuffers 関数に非常に長い時間がかかり、フレーム レートが非常に低くなります。
下記のリンクの方法を試してみましたが、うまくいきませんでした。何らかの情報(できれば実際の例)を提供してください。
https://community.freescale.com/docs/DOC-98062
https://github.com/rogeriorps/ipu-examples/commit/8c828cede9f3d3ef329368b2e3d06c604264ec8d