Как точить изображение в OpenCV? - PullRequest
106 голосов
/ 14 февраля 2011

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

Ответы [ 8 ]

149 голосов
/ 14 февраля 2011

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

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

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

Параметры, которые необходимо настроить для себя,

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

32 голосов
/ 16 августа 2016

Вы можете попробовать простое ядро ​​ и функцию 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)

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

13 голосов
/ 28 ноября 2015

Вы можете найти пример кода о повышении резкости изображения с использованием алгоритма «нерезкая маска» при Документация OpenCV .

Изменение значений sigma, thresholdamount даст разные результаты.

// 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);
3 голосов
/ 31 января 2019

Любое изображение - это совокупность сигналов различных частот.Более высокие частоты контролируют края, а более низкие частоты контролируют содержание изображения.Края формируются, когда в соседней ячейке происходит резкий переход от значения одного пикселя к значению другого пикселя, например 0 и 255.Очевидно, что есть резкое изменение и, следовательно, край и высокая частота.Для повышения резкости изображения эти переходы могут быть еще более улучшены.

Один из способов заключается в свертывании ядра фильтра, созданного самим собой.размытая версия изображения из яркой версии.Это помогает повысить резкость изображения.Но это следует делать с осторожностью, так как мы просто увеличиваем значения пикселей.Представьте себе значение 190 в градациях серого, которое при умножении на вес 2 составляет 380, но обрезается до 255 из-за максимально допустимого диапазона пикселей.Это потеря информации и приводит к размыванию изображения.

addWeighted(frame, 1.5, image, -0.5, 0, image);
2 голосов
/ 09 апреля 2019

Вы можете повысить резкость изображения, используя нерезкую маску .Вы можете найти больше информации о нерезком маскировании здесь .А вот реализация 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)
2 голосов
/ 21 сентября 2018

Для ясности в этой теме следует сделать несколько замечаний:

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

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

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

0 голосов
/ 14 июня 2019

Для повышения резкости изображения мы можем использовать фильтр (как во многих ответах выше)

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, ядро)

0 голосов
/ 02 марта 2014

Попробуйте с этим:

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

Вы можете найти больше информации здесь

...