Как заострить изображение в OpenCV?


Как заострить изображение с помощью OpenCV? Есть много способов сглаживания или размытия, но ни один из них я не мог видеть заточки.

5 92

5 ответов:

одна общая процедура изложена в статья Википедии о нерезкой маскировке: Вы используете гауссовский сглаживающий фильтр и вычитаете сглаженную версию из исходного изображения (взвешенным образом, чтобы значения постоянной области оставались постоянными).

чтобы получить заточенную версию frame на image: (как cv::Mat)

cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);

параметры есть то, что вам нужно настроить для себя.

есть еще лапласиан заточка, вы должны найти что-то на этом, когда вы google.

вы можете попробовать простой ядро и filter2D функция, например, в Python:

kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
im = cv2.filter2D(im, -1, kernel)

Википедия имеет хороший обзор ядер с некоторыми другими примерами здесь -https://en.wikipedia.org/wiki/Kernel_ (image_processing)

в обработке изображений ядро, матрица свертки или маска-это небольшая матрица. Он используется для размытия, заточки, тиснения, обнаружения краев и многое другое. Это выполняется путем выполнения свертки между ядром и изображением.

вы можете найти пример кода, о резкость изображения с помощью алгоритма "нерезкая маска" at Документация OpenCV

изменение значений sigma,threshold,amount даст разные результаты

// sharpen image using "unsharp mask" algorithm
Mat blurred; double sigma = 1, threshold = 5, amount = 1;
GaussianBlur(img, blurred, Size(), sigma, sigma);
Mat lowContrastMask = abs(img - blurred) < threshold;
Mat sharpened = img*(1+amount) + blurred*(-amount);
img.copyTo(sharpened, lowContrastMask);

для ясности в этой теме, несколько моментов действительно должны быть сделаны:

  1. повышение резкости изображений является некорректно поставленной задачей. Другими словами, размытие-это операция с потерями, и возвращение от нее вообще невозможно.

  2. чтобы заострить отдельные изображения, вам нужно каким-то образом добавить ограничения (предположения) на то, какое изображение вы хотите, и как оно стало размытым. Это область естественной статистики изображений. Подходы к делу заточка держит эти статистические данные явно или неявно в своих алгоритмах (глубокое обучение является наиболее неявно закодированными). Общий подход к повышению-взвешивание некоторых уровней a разложение пирамиды собаки или Лапласа, что является обобщением ответа Брайана Бернса, предполагает, что гауссовское размытие испортило изображение, и то, как выполняется взвешивание, связано с предположениями о том, что было в изображении для начала.

  3. других источников информация может сделать проблему обострения хорошо поставленной. Распространенным таким источником информации является видео движущегося объекта или многовидовая настройка. Заточка в этой настройке обычно называется супер-разрешение (это очень плохое название для него, но он застрял в академических кругах). Там было методы сверхразрешения в OpenCV С давних времен.... хотя они обычно не работают так хорошо для реальных проблем, в последний раз я проверил их. Я ожидаю глубокого обучения произвел некоторые замечательные результаты и здесь. Может быть, кто-то будет размещать в комментариях о том, что стоит там.

попробуйте с помощью этого:

cv::bilateralFilter(img,9,75,75);

вы можете найти более подробную информацию здесь