2016-12-16 25 views
1

16ビットのグレースケール画像でコントラストを伸ばしたい。 void normalize(InputArray src, OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray())は私に少し明るいイメージを与えますが、まだ暗すぎます。OpenCV:16ビットのグレースケール画像を正規化すると弱い結果になる

ドキュメント: http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#normalize

は、αが下限とベータ上限であると述べています。したがって、16ビットイメージの場合、私は0を期待し、65535.0は正しい値です。私は研究を行いました。ほとんどの答えは、アルファとベサが正規化された画像で最小値と最大値であることを指摘しました。

#include "stdafx.h" 
#include <iostream> 
#include <opencv2/opencv.hpp> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
int main() 
{ 
    cv::Mat image; 
    image = cv::imread("darkImage.tif", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_GRAYSCALE); 

if (!image.data)       
    { 
     std::cout << "Could not open or find the image" << std::endl; 
     return -1; 
    } 

    cv::namedWindow("Original", CV_WINDOW_NORMAL | CV_WINDOW_KEEPRATIO); 
    cv::imshow("Original", image); 

    cv::normalize(image, image, 0, 65535.0, cv::NORM_MINMAX, CV_16U); 
    cv::namedWindow("Normalize", CV_WINDOW_NORMAL | CV_WINDOW_KEEPRATIO); 
    cv::imshow("Normalize", image); 
    cv::waitKey(); 

    return 0; 

} 

Original and Normalized imageコントラスト強調が十分でないことを示します。 ImageJの正規化は私にはるかに良いresultを与える。

アルファ値とベータ値は16ビット画像に適していますか? 私はopencvで新しくなり、助けが得られました。私が使用

:opencv3.1を、VisualStudio2015、W10は、64ビット

+1

ヒストグラム均等化を使用しましたか?単純なコントラスト強調をしているのはなぜですか? – rayryeng

答えて

0

うん、たぶんequaliztionが進むべき道であるヒストグラム。 EqualizeHistは16ビットでは機能しません。だから私はどちらか

image.convertTo(image,CV_8U,1./256.); 

または

equalizeHist(image,imageEq); 

続い

image.convertTo(image,CV_32F); 

をお勧めします8ビットのオプションをしようと、真の、しかし切り捨て中に情報が失われる可能性がありますされています。私はフロートのためにこれを試していないが、私はそれが浮動小数点の目的を敗北させるとにかく、内部的に切り捨て/ビニングを終了すると思われる。

また、ランタイム/ dev-timeに関係がないように正しく実行したい場合は、16ビットのヒストグラムとそれに続く16ビットから8ビットのルックアップテーブルを実装することができますヒストグラム等化/ CLAHE。 (累積分布関数を作成し、この65Kベクトルをルックアップテーブルとして画像に直接適用して、結果を均一に分布させる)平均的で妥当な標準偏差であれば、次のようなことができます。

Scalar imMean, imStd; 
meanStdDev(image, imMean, imStd); 
double a = (1<<16)*(0.25/imStd.val[0]); // give equalized image a stdDev of 0.25 
double b = (1<<16)*0.5 - a*imMean.val[0]; // give equalized image a mean of 0.5 
imageEq = a*image+b; 
+0

重要なのは、入力と出力で16bitを使用しなければならないということです。また、この方法も比較的速く行う必要があります。私は30 fpsの2.5Kx2.1Kのpix画像を私に与える科学的なカメラを持っています。私はまだcv :: normalization()が自分のイメージを適切に向上させない理由を不思議です。私のイメージは、このタイプのメソッドや間違ったパラメータには不適切ですか? –

+0

Ahh、ok。その場合は、編集したとおりに5行で自分で正規化を行うことができます。 – willem

関連する問題