opencv求图像Laplacian边缘,衡量图像的模糊程度

求一幅图像的模糊程度:

高斯模糊->灰度化->拉普拉斯计算->绝对值(convertScaleAbs)->计算输出图像的方差,根据此方差来判断模糊程度。

 

1、高斯模糊,GaussianBlur()

void GaussianBlur( InputArray src, OutputArray dst, Size ksize,
                                double sigmaX, double sigmaY = 0,
                                int borderType = BORDER_DEFAULT );

参数说明:

src:原始输入图像。
dst:与src大小和通道相同的目标(输出)图像。

ksize:高斯核的大小,ksize.width和ksize.height可以不同,但两者都必须是正奇数;或者,它们可以是零,然后根据sigma计算。

sigmaX:高斯核在X方向的标准差。

sigmaY:高斯核在Y方向的标准差。如果sigmaY为零,则设置为等于sigmaX;如果两个sigma都为零,则分别从ksize.width和ksize.height计算。

borderType:像素扩展方法。

代码示例:
GaussianBlur(srcImage, srcBlur, cv::Size(3, 3), 0, 0, cv::BORDER_DEFAULT);

 

2、灰度化,cvtColor()

void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );

参数说明:

src:输入图像

dst:输出图像

代码示例:

cvtColor(srcImage, gray, CV_BGR2GRAY);

 

3、拉普拉斯计算,Laplacian()

void Laplacian( InputArray src, OutputArray dst, int ddepth,
                             int ksize = 1, double scale = 1, double delta = 0,
                             int borderType = BORDER_DEFAULT );

参数说明:

src:原始输入图像。
dst:与src大小和通道相同的目标(输出)图像。
ddepth:目标图像所需的深度;【输入图像的深度是 CV_8U ,这里必须定义 ddepth = CV_16S 以避免外溢】。
ksize:用于计算二阶倒数滤波器的 孔径尺寸,这个值必须是一个正奇数;【内部调用的 Sobel算子的内核大小】。
scale:计算拉普拉斯值的缩放因子,默认不缩放。
delta:加到dst 图像上的固定值。
borderType:像素扩展方法。

代码示例:

Laplacian(gray, laplaci, CV_16S, 3, 1, 0, cv::BORDER_DEFAULT);

 

4、绝对值,类型转换,convertScaleAbs()

对图像中的每个元素,实现如下操作:

void convertScaleAbs(InputArray src, OutputArray dst,
                                  double alpha = 1, double beta = 0);

参数说明:

src:输入图像

dst:输出图像
alpha:缩放因子
beta :加到缩放后的固定值,偏移量

代码示例:

convertScaleAbs(laplaci, normallaplaci);

 

5、计算图像的方差,meanStdDev()

    void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev,
                             InputArray mask=noArray());

    参数说明:    

    src:输入图像

    mean:图像的均值

    stddev :图像的标准差

    代码示例:

    cv::Mat tmp_m1, tmp_sd1;    //用来存储均值和方差  
    double m1 = 0, sd1 = 0;
    meanStdDev(normallaplaci, tmp_m1, tmp_sd1);
    m1 = tmp_m1.at(0, 0); //均值  
    sd1 = tmp_sd1.at(0, 0); //标准差  
    std::cout << "均值: " << m1 << " , 方差: " << sd1*sd1 << std::endl;

    注意,meanStdDev()计算结果是double类型;【上面的代码中,如果定义为float型,输出结果不正确】

                计算的均值和标准差都以Mat形式返回,这里返回的是1X1的矩阵。所以访问结果,要访问Mat的元素。

你可能感兴趣的:(OpenCV)