2016-12-16 216 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

说alpha是下限和β上限。所以在16位图像的情况下,我期望0和65535.0是正确的值。我做了一项研究,大多数答案都指出,alpha和betha是规范化图像中的最小值和最大值。

#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

alpha和beta值是否适合16位图像? 我是opencv中的新成员,任何帮助都是合适的。

我用:opencv3.1,VisualStudio2015,W10,64位

+1

你试过使用任何均衡技术?...直方图均衡?为什么你只是坚持简单的对比度增强? – rayryeng

回答

0

呀,大概直方图equaliztion是要走的路。 EqualizeHist不适用于16位。因此,我建议要么

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

image.convertTo(image,CV_32F); 

其次

equalizeHist(image,imageEq); 

8位的选项是尝试和真实,但截断过程中可能会丢失信息。我还没有尝试过这种浮动,但我怀疑它终于在内部截断/ binning,这打破了浮动的目的。另外,如果你想正确地做,并且不关心运行时间/开发时间,你可以实现一个16位直方图,然后是一个16位到8位查找表,遵循后面的想法直方图均衡/ CLAHE。 (创建累积分布函数,并将该65K矢量直接作为查找表应用于图像,以使结果均匀分布。)

或者如果您想要自己执行cv :: normalize()的版本来给中心平均和合理的标准差,你可以这样做:

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

关键在于,我必须坚持16位输入和输出。而且这个方法也应该比较快。我有科学相机,它给了我高达30帧/秒的2.5Kx2.1K像素图像。我仍然想知道为什么cv :: normalization()不能正确地增强我的图像。我的图片不适合这种类型的方法或错误的参数吗? –

+0

啊,好的。在这种情况下,您可以按照编辑的5行进行标准化。 – willem