Как эффективно определить степень размытия лица в c ++? - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь определить частоту размытия изображений лица с помощью приведенного ниже кода.

cv::Mat greyMat;
cv::Mat laplacianImage;
cv::Mat imageClone = LapMat.clone();

cv::resize(imageClone, imageClone, cv::Size(150, 150), 0, 0, cv::INTER_CUBIC);

cv::cvtColor(imageClone, greyMat, CV_BGR2GRAY);
Laplacian(greyMat, laplacianImage, CV_64F);

cv::Scalar mean, stddev; // 0:1st channel, 1:2nd channel and 2:3rd channel
meanStdDev(laplacianImage, mean, stddev, cv::Mat());
double variance = stddev.val[0] * stddev.val[0];

cv :: Mat M = (cv :: Mat_ (3, 1) << -1, 2, -1); cv :: Mat G = cv :: getGaussianKernel (3, -1, CV_64F); </p>

cv::Mat Lx;
cv::sepFilter2D(LapMat, Lx, CV_64F, M, G);

cv::Mat Ly;
cv::sepFilter2D(LapMat, Ly, CV_64F, G, M);

cv::Mat FM = cv::abs(Lx) + cv::abs(Ly);

double focusMeasure = cv::mean(FM).val[0];
return focusMeasure;

это иногда дает плохие результаты, как на картинке.

Существует ли лучший способ обнаружения размытых лиц? Я приложил пример изображения с высокой оценкой с кодом выше, который является ложным.

Лучший

BlurFace Image

1 Ответ

0 голосов
/ 09 марта 2020

Я не уверен, как вы интерпретируете свои результаты. Чтобы измерить размытие, вы обычно берете выходные данные Blur Detector (число) и сравниваете их с пороговым значением, а затем определяете, является ли входной сигнал размытым или нет. Я не вижу такого сравнения в вашем коде.

Есть несколько способов измерить "размытость" или, скорее, резкость. Давайте посмотрим на один. Он включает в себя вычисление дисперсии лапласиана и сравнение ее с ожидаемым значением. Это код:

//read the image and convert it to grayscale:
cv::Mat inputImage = cv::imread( "dog.png" );
cv::Mat gray;
cv::cvtColor( inputImage, gray, cv::COLOR_RGB2GRAY );

//Cool, let's compute the laplacian of the gray image:
cv::Mat laplacianImage;
cv::Laplacian( gray, laplacianImage, CV_64F );

//Prepare to compute the mean and standard deviation of the laplacian:
cv::Scalar mean, stddev; 
cv::meanStdDev( laplacianImage, mean, stddev, cv::Mat() );

//Let’s compute the variance:
double variance = stddev.val[0] * stddev.val[0];

До этого момента мы эффективно рассчитывали дисперсию лапласиана, но нам все равно нужно сравнивать с порогом:

double blurThreshold = 300;

if ( variance <= blurThreshold ) {
    std::cout<<"Input image is blurry!"<<std::endl;
} else {
    std::cout<<"Input image is sharp"<<std::endl;
}

Давайте проверить результаты. Эти являются моими тестовыми изображениями. Я напечатал значение дисперсии в левом нижнем углу изображений. Пороговое значение составляет 300, синий текст находится в допустимых пределах, красный текст находится ниже.

enter image description here enter image description here

...