Как определить качество изображения?

Как я, имея некачественное размытое изображение, могу определить его как размытое?
  • Вопрос задан
  • 569 просмотров
Пригласить эксперта
Ответы на вопрос 3
InternetMaster
@InternetMaster
Интернет
Сделать нейросеть. Она будет определять.
Ответ написан
Vindicar
@Vindicar
RTFM!
Ну например, так: используй фильтр Кэнни на изображении, посчитай число белых пикеселей (контуров).
Размой изображение слегка и используй фильтр Кэнни на размытом изображении. Белый пикселей (контуров) будет меньше, так как часть контуров станет слишком размыта. Чем размытее изображение, тем меньше будет разница.
Ответ написан
Комментировать
@odissey_nemo
Программист, ГИС-системы, растры, космоснимки
Что, если пройтись матричным фильтром, размерностью 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 (между чёрным и белым).
В Инете можно найти уйму других подходов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы