求一幅图像的模糊程度:
高斯模糊->灰度化->拉普拉斯计算->绝对值(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
sd1 = tmp_sd1.at
std::cout << "均值: " << m1 << " , 方差: " << sd1*sd1 << std::endl;
注意,meanStdDev()计算结果是double类型;【上面的代码中,如果定义为float型,输出结果不正确】
计算的均值和标准差都以Mat形式返回,这里返回的是1X1的矩阵。所以访问结果,要访问Mat的元素。