Как сделать резкость изображения с помощью OpenCV? Существует много способов сглаживания или размытия, но я не вижу резкости.
Как заострить изображение в OpenCV?
Ответ 1
Одна общая процедура изложена в статье в википедии о нечеткой маскировке: Вы используете гауссовский фильтр сглаживания и вычитаете сглаженную версию из исходного изображения (взвешенным образом, чтобы значения постоянной области оставались постоянными).
Чтобы получить заостренную версию frame
в image
: (оба cv::Mat
)
cv::GaussianBlur(frame, image, cv::Size(0, 0), 3);
cv::addWeighted(frame, 1.5, image, -0.5, 0, image);
В параметрах есть что-то, что вам нужно настроить самостоятельно.
Там также лапласианская заточка, вы должны найти что-то на этом, когда вы google.
Ответ 2
Вы можете попробовать простое ядро и функцию 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)
При обработке изображений ядро, матрица свертки или маска представляют собой небольшую матрицу. Он используется для размытия, повышения резкости, тиснения, обнаружения краев и многого другого. Это достигается путем свертки между ядром и изображением.
Ответ 3
Вы можете найти пример кода об увеличении резкости изображения с помощью алгоритма "нерезкая маска" в документации 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);
Ответ 4
Для ясности в этой теме следует сделать несколько замечаний:
-
Резкость изображений - некорректная проблема. Другими словами, размытие - это операция с потерями, и возврат к ней вообще невозможен.
-
Чтобы повысить резкость отдельных изображений, необходимо каким-то образом добавить ограничения (предположения) о том, какой тип изображения вы хотите получить, и как оно стало размытым. Это область статистики естественных изображений. Подходы к повышению резкости держат эту статистику явно или неявно в своих алгоритмах (глубокое обучение является наиболее неявно кодируемым). Обычный подход к повышению веса некоторых уровней разложения СОЗ или лапласовой пирамиды, который является обобщением ответа Брайана Бернса, предполагает, что размытие по Гауссу исказило изображение, и то, как выполняется взвешивание, связано с предположениями о том, что было на изображении для начала.
-
Другие источники информации могут помочь обострить проблему. Распространенными такими источниками информации являются видео движущегося объекта или настройка нескольких просмотров. Повышение резкости в этом параметре обычно называется супер-разрешением (что является очень плохим названием, но оно застряло в академических кругах). В OpenCV уже давно существуют методы суперразрешения... хотя они обычно не работают так хорошо для реальных проблем, в последний раз я их проверял. Я ожидаю, что глубокое обучение дало здесь и замечательные результаты. Может быть, кто-то напишет в комментариях о том, что там стоит.
Ответ 5
Любое изображение представляет собой совокупность сигналов различных частот. Более высокие частоты контролируют края, а более низкие частоты контролируют содержание изображения. Края формируются, когда в соседней ячейке происходит резкий переход от значения одного пикселя к значению другого пикселя, например 0 и 255. Очевидно, что есть резкое изменение и, следовательно, край и высокая частота. Для повышения резкости изображения эти переходы могут быть дополнительно улучшены.
Одним из способов является свертывание ядра фильтра с изображением.
import cv2
import numpy as np
image = cv2.imread('images/input.jpg')
kernel = np.array([[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1]])
sharpened = cv2.filter2D(image, -1, kernel) # applying the sharpening kernel to the input image & displaying it.
cv2.imshow('Image Sharpening', sharpened)
cv2.waitKey(0)
cv2.destroyAllWindows()
Есть еще один метод вычитания размытой версии изображения из его яркой версии. Это помогает повысить резкость изображения. Но это следует делать с осторожностью, так как мы просто увеличиваем значения пикселей. Представьте себе значение 190 пикселя в градациях серого, которое при умножении на вес 2 составляет 380, но обрезается до 255 из-за максимально допустимого диапазона пикселей. Это потеря информации и приводит к размыванию изображения.
addWeighted(frame, 1.5, image, -0.5, 0, image);
Ответ 6
Вы можете повысить резкость изображения, используя нерезкую маску. Вы можете найти больше информации о нерезком маскировании здесь. А вот реализация Python с использованием OpenCV:
import cv2 as cv
import numpy as np
def unsharp_mask(image, kernel_size=(5, 5), sigma=1.0, amount=1.0, threshold=0):
"""Return a sharpened version of the image, using an unsharp mask."""
blurred = cv.GaussianBlur(image, kernel_size, sigma)
sharpened = float(amount + 1) * image - float(amount) * blurred
sharpened = np.maximum(sharpened, np.zeros(sharpened.shape))
sharpened = np.minimum(sharpened, 255 * np.ones(sharpened.shape))
sharpened = sharpened.round().astype(np.uint8)
if threshold > 0:
low_contrast_mask = np.absolute(image - blurred) < threshold
np.copyto(sharpened, image, where=low_contrast_mask)
return sharpened
def example():
image = cv.imread('my-image.jpg')
sharpened_image = unsharp_mask(image)
cv.imwrite('my-sharpened-image.jpg', sharpened_image)
Ответ 7
Попробуйте Как заострить изображение в OpenCV за помощью! Код и изображения выглядят так, как будто они должны быть тем, что вы ищете.
Ответ 8
Для повышения резкости изображения мы можем использовать фильтр (как во многих ответах выше)
kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32)
kernel/=denominator*kernel
it will the most when the denominator is 1 and will decrease as increased(2.3..)
the most used one is when the denominator is 3.
ниже реализация.
kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, 0]], np.float32)
Ядро = 1/3 * ядро
ДСТ = cv2.filter2D (изображение, -1, ядро)
Ответ 9
Попробуйте следующее:
cv::bilateralFilter(img,9,75,75);
Вы можете найти более подробную информацию здесь