自動レベル、自動コントラスト、および3つのヒストグラム等化アルゴリズムが特にレタッチで、多くのデザイナーは、まず、画像を開いて、非常に単純な、ごく普通ですが、実用的なアプリケーションでは非常に高い利用率を持っています操作は、Shiftキー+ Ctrlキー+ L(オートレベル)です。原則の実現には、それらはすべて統計的ヒストグラムベースのアルゴリズムに属し、効率が非常に高いです。私は、自動コントラスト、自動レベルアルゴリズム-画像調整ここでは詳細に説明されていない詳細な分析と解釈を行って、そのプロセスの記事、中を。
しかし、時には我々は自動レベル補正やコントラストを調整を見つけること、などが調整されます以下は、ソフトウェアで、私はそれらを改善するためのいくつかの方法を発見した(Aことを覚えていない)、次のように、コアの改良点は以下のとおりです。
通常の方法:
用(INT Y = 0 ; Y < 256 ; Y ++ ) { もし(Y < 最小) テーブル[Y] = 0 ; それ以外の 場合(Y> マックス) テーブル[Y] = 255 。 他 表[Y] = IM_ClampToByte((フロート)(Y -最小)/(最大-最小)* 255 )。 }
方法を改善します:
フロート平均= 0は、平均= 0、合計= 0 ; 用(INT Y = 0 ; Y < 256 ; Y ++ ) { 和 + = Histgram [Y]。 平均 + = Y * Histgram [Y]。 } 平均 =平均/ 合計。 フロートガンマ=ログ(0.5F)/ログ((フロート)(平均値-最小)/(最大- 最小))。 もし(ガンマ< 0.1F ) ガンマ = 0.1F ; それ以外の 場合(>ガンマ10 ) ガンマ = 10 。 用(INT Y = 0 ; Y < 256 ; Y ++ ) { もし(Y < 最小) テーブル[Y] = 0 ; それ以外の 場合(Y> マックス) テーブル[Y] = 255 。 他 表[Y] = IM_ClampToByte(POW((フロート)(Y -最小)/(最大-最小)、ガンマ)* 255 )。 }
意味MaxとMinが他の記事を参照してください。
調整は、彼がガンマ補正と自動階調、対応する従来の自動階調スケールを組み合わせるアイデアに対応するかを決定するために、この値に基づいてガンマ値を描き、全体のグラフの平均のルックアップテーブルに改善検討=ガンマ1、または例えば、私のお気に入りのバー・テスト・パターンのいくつかを取ります。
標準原稿自動階調改善後の自動レベル
これは、改善された、より合理的なようです。
改善されたヒストグラム均等化のために、私はImageJののコードでこの一節を見つけます:
// Changes the tone curves of images. // It should bring up the detail in the flat regions of your image. // Histogram Equalization can enhance meaningless detail and hide important but small high-contrast features. This method uses a // similar algorithm, but uses the square root of the histogram values, so its effects are less extreme. Hold the alt key down // to use the standard histogram equalization algorithm. This code was contributed by Richard Kirk ([email protected]). // ImageJ\source\ij\plugin\ContrastEnhancer.java
他的核心代码修改如下:
private void equalize(ImageProcessor ip, int[] histogram) { ip.resetRoi(); if (ip instanceof ShortProcessor) { // Short max = 65535; range = 65535; } else { //bytes max = 255; range = 255; } double sum; sum = getWeightedValue(histogram, 0); for (int i=1; i<max; i++) sum += 2 * getWeightedValue(histogram, i); sum += getWeightedValue(histogram, max); double scale = range/sum; int[] lut = new int[range+1]; lut[0] = 0; sum = getWeightedValue(histogram, 0); for (int i=1; i<max; i++) { double delta = getWeightedValue(histogram, i); sum += delta; lut[i] = (int)Math.round(sum*scale); sum += delta; } lut[max] = max; applyTable(ip, lut); }
private double getWeightedValue(int[] histogram, int i) { int h = histogram[i]; if (h<2 || classicEqualization) return (double)h; return Math.sqrt((double)(h)); }
他这里主要是对直方图的数据进行了开根号,这样可以减少有些色阶特别集中的直方图对修正后的图像的影响,他可以解决普通的直方图均衡化有时候处理起来图像变换太大的问题,我们同样以上述两幅图来做示范。
原图 标准的直方图均衡化 改进后的直方图均衡化
可以明显的看到,标准的直方图均衡化对两幅图的处理都太过分,而改进后的则效果要和谐和自然很多。
这种改进还可以嵌入到很多其他的和直方图有关的算法中,比如CLAHE等等,也可以有效的改进他们的效果。
本人的SSE算法优化合集DEMO: http://files.cnblogs.com/files/Imageshop/SSE_Optimization_Demo.rar。