Что, если пройтись матричным фильтром, размерностью 3x3, 5x5, 7x7 и т.д.
В ответе он выдаёт среднее цветовое расстояние между центральным пикселем и соседними.
Прямо в цикле суммируешь эти величины. В конце делишь на площадь в пикселях. И получаешь среднюю изменчивость картинки на пиксель.
Провести несколько экспериментов, найти пороговое значение на свой вкус. Оценить изменение значений в зависимости от размера фильтра, размера изображения, вида изображения (цветное, серое).
И выдать суждение: до сюда - нормальное изображение, а отсюда - размытое. Между значениями - неопределённость.
Может и получиться!
Цветовая дистанция - это тоже проблема, как его посчитать.
Последнее время использую простую эмпирическая функция расчёта разницы между двумя цветами в Java:
public static final double SQRT_3 = Math.sqrt( 3.0d );
/**
* Calculates distance in RGB color space with Euklidian distance between each component
*
* @param c1 {@link Color} one
* @param c2 {@link Color} two
* @return double result of comparison. Max possible distance is 255.0. Minimum 0.0
*/
public static double colorDistance( Color c1, Color c2 )
{
double rDist = c1.getRed() - c2.getRed();
double gDist = c1.getGreen() - c2.getGreen();
double bDist = c1.getBlue() - c2.getBlue();
double distance = Math.sqrt( rDist * rDist + gDist * gDist + bDist * bDist ) / SQRT_3;
return distance;
}//end color distance method
Уже не помню, почему именно её, т.к раньше была другая, но изменил по каким-то теоретическим соображениям. Давно.
Для моих задач работает сносно. Разница получается от 0 (одинаковые цвета) до 255 (между чёрным и белым).
В Инете можно найти уйму других подходов.