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

Я попробовал ядро обнаружения ребер

[-1 -1 -1]
[-1  9 -1]
[-1 -1 -1]

И точить ядро

[ 0 -1  0]
[-1  5 -1]
[ 0 -1  0]

Но результаты выглядят зернистыми и неестественными. Чтобы сгладить шум, я попробовал методы размытия, такие как cv2.medianBlur() и cv2.GaussianBlur(), но результаты не так уж хороши. Изображения имеют размытый фон или темный цвет, что затрудняет их различение. Есть ли лучший способ выделить больше деталей, особенно в фоновом режиме? Открыто для Python или C ++

Входные изображения

enter image description here

Текущие результаты введите описание изображения здесь

import numpy as np
import cv2

img = cv2.imread('people.jpg')
grayscale = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# edge_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen_kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]])
img = cv2.filter2D(grayscale, -1, sharpen_kernel)

# Smooth out image
# blur = cv2.medianBlur(img, 3)
blur = cv2.GaussianBlur(img, (3,3), 0)

cv2.imshow('img',img)
cv2.imwrite('img.png',img)
cv2.imshow('blur',blur)
cv2.waitKey(0)
4
coffeewin 28 Июн 2019 в 22:50

4 ответа

Лучший ответ

Выравнивание гистограммы может помочь улучшить контрастность изображения в градациях серого путем расширения диапазона интенсивности. Вот визуализация гистограммы входного изображения

from matplotlib import pyplot as plt
import cv2

# Load in image as grayscale
image = cv2.imread('1.jpg', 0)

plt.hist(image.ravel(), 256, [0,256])

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

equalize = cv2.equalizeHist(image)
plt.hist(equalize.ravel(), 256, [0,256])

Диапазоны интенсивности теперь равномерно распределены. Выравнивание гистограммы учитывает глобальный контраст изображения и прекрасно работает, когда гистограмма изображения ограничена определенной областью. Вот результат

enter image description here


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

clahe = cv2.createCLAHE().apply(image)
plt.hist(clahe.ravel(), 256, [0,256])

Этот вариант делит пиксели на небольшие блоки перед выполнением адаптивной коррекции гистограммы.

enter image description here

Вот визуализация между двумя методами введите описание изображения здесь

3
nathancy 28 Июн 2019 в 23:17

Просто для сравнения, у меня есть скрипт ImageMagick, который делает пространственно адаптивное улучшение контраста (называемое пробелом). См. http://www.fmwconcepts.com/imagemagick.

Вход:

enter image description here

space -c 2 -w 20 img.jpg result.png


введите описание изображения здесь

Более подробно, но немного зернисто.

Вот результат из моего варианта space2, который может быть более приятным для вас.

space2 -w 5 -m 10 img.jpg result_space2_w5_m10.jpg


введите описание изображения здесь

Объяснение :

SPACE2 - это адаптивная техника для повышения яркости и контрастности изображения. ПРОСТРАНСТВО - это аббревиатура для пространственно-адаптивного усиления контраста.

Адаптивная формула R = M + G * (I-M). Здесь R - результирующее изображение. Я является входным изображением. М - среднее изображение, которое является фильтрованной версией низкочастотного входного изображения. Он генерируется путем изменения размера входного изображения до некоторой доли входного размера. Размер изменения вычисляется из размера окна. Это изображение затем снова расширяется до исходного размера. Техника изменения размера - это быстрый способ применения скользящего среднего окна большого размера. Термин (I-M) является фильтрованной версией версии входного изображения. G представляет собой изображение усиления, которое включает в себя S, стандартное отклонение входного изображения, сгенерированное той же техникой изменения размера, которая используется для создания среднего изображения, M. G также включает в себя желаемое стандартное отклонение (dstd) и коэффициент максимального усиления. Изображение усиления, G, используется для установки количества деталей (резкости) на выходе, а также для ограничения усиления при разгоне. Максимальное усиление обычно составляет порядка 1-10, по умолчанию 2,5. Размер окна блока обычно составляет порядка 5-20% от размера изображения и номинально 8%. В некоторых случаях может потребоваться увеличить максимальное значение усиления, чем значение по умолчанию, например, при попытке извлечь информацию из туманного изображения. Алгоритм имеет опции для управления яркостью, контрастностью и насыщенностью. Яркость и контраст имеют автоматически рассчитанные значения по умолчанию, которые зависят от изображения. Они применяются через сигмоидальные нелинейные функции. Насыщенность - это линейная корректировка в цветовом пространстве LAB, по умолчанию она не меняется.

3
fmw42 10 Июл 2019 в 01:02

Вы можете попробовать применить гауссовскую фильтрацию с сохранением краев вместо GaussianBlur.

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

Есть реализации OpenCV, но я никогда не пробовал их.

Следующий код MATLAB демонстрирует фильтры:

I = rgb2gray(im2double(imread('I.jpg')));

G = imguidedfilter(I, 'DegreeOfSmoothing', 0.005);
J = imsharpen(G, 'Amount', 2);

figure;imshow(J)

B = imbilatfilt(I);
K = imsharpen(B, 'Amount', 2);
figure;imshow(K)

Управляемый фильтр:
Управляемый фильтр

Двусторонний фильтр:
введите описание изображения здесь

3
Rotem 28 Июн 2019 в 21:06

Вы можете сделать фильтр более слабым, например,

sharpen_kernel = np.array([[0,-.5,0], [-.5,3,-.5], [0,-.5,0]])

Или, может быть, попробуйте нерезкое маскирование

gaussian_3 = cv2.GaussianBlur(grayscale, (9,9), 10.0)
img = cv2.addWeighted(img, 1.5, gaussian_3, -0.5, 0, img)
2
Julian 6 Июл 2019 в 02:22