- Убрать шум opencv python
- Theory
- Image Denoising in OpenCV
- 1. cv.fastNlMeansDenoisingColored()
- 3 шага для улучшения изображений с помощью шумоподавления OpenCV в Python
- Вступление
- Модель шумоподавления
- Шаг 1. Установка пакетов
- Шаг 2: Импорт изображения
- Шаг 3: уменьшение шума изображения
- Сравнение результатов
- Уроки компьютерного зрения на Python + OpenCV с самых азов. Часть 2
Убрать шум opencv python
- You will learn about Non-local Means Denoising algorithm to remove noise in the image.
- You will see different functions like cv.fastNlMeansDenoising(), cv.fastNlMeansDenoisingColored() etc.
Theory
In earlier chapters, we have seen many image smoothing techniques like Gaussian Blurring, Median Blurring etc and they were good to some extent in removing small quantities of noise. In those techniques, we took a small neighbourhood around a pixel and did some operations like gaussian weighted average, median of the values etc to replace the central element. In short, noise removal at a pixel was local to its neighbourhood.
There is a property of noise. Noise is generally considered to be a random variable with zero mean. Consider a noisy pixel, \(p = p_0 + n\) where \(p_0\) is the true value of pixel and \(n\) is the noise in that pixel. You can take large number of same pixels (say \(N\)) from different images and computes their average. Ideally, you should get \(p = p_0\) since mean of noise is zero.
You can verify it yourself by a simple setup. Hold a static camera to a certain location for a couple of seconds. This will give you plenty of frames, or a lot of images of the same scene. Then write a piece of code to find the average of all the frames in the video (This should be too simple for you now ). Compare the final result and first frame. You can see reduction in noise. Unfortunately this simple method is not robust to camera and scene motions. Also often there is only one noisy image available.
So idea is simple, we need a set of similar images to average out the noise. Consider a small window (say 5×5 window) in the image. Chance is large that the same patch may be somewhere else in the image. Sometimes in a small neighbourhood around it. What about using these similar patches together and find their average? For that particular window, that is fine. See an example image below:
The blue patches in the image looks the similar. Green patches looks similar. So we take a pixel, take small window around it, search for similar windows in the image, average all the windows and replace the pixel with the result we got. This method is Non-Local Means Denoising. It takes more time compared to blurring techniques we saw earlier, but its result is very good. More details and online demo can be found at first link in additional resources.
For color images, image is converted to CIELAB colorspace and then it separately denoise L and AB components.
Image Denoising in OpenCV
OpenCV provides four variations of this technique.
- cv.fastNlMeansDenoising() — works with a single grayscale images
- cv.fastNlMeansDenoisingColored() — works with a color image.
- cv.fastNlMeansDenoisingMulti() — works with image sequence captured in short period of time (grayscale images)
- cv.fastNlMeansDenoisingColoredMulti() — same as above, but for color images.
- h : parameter deciding filter strength. Higher h value removes noise better, but removes details of image also. (10 is ok)
- hForColorComponents : same as h, but for color images only. (normally same as h)
- templateWindowSize : should be odd. (recommended 7)
- searchWindowSize : should be odd. (recommended 21)
Please visit first link in additional resources for more details on these parameters.
We will demonstrate 2 and 3 here. Rest is left for you.
1. cv.fastNlMeansDenoisingColored()
As mentioned above it is used to remove noise from color images. (Noise is expected to be gaussian). See the example below:
3 шага для улучшения изображений с помощью шумоподавления OpenCV в Python
В этой статье я покажу вам, как реализовать снижение шума за три простых шага. Мы будем использовать модель шумоподавления, обученную машинному обучению. Это одна из лучших моделей шумоподавления, которые я когда-либо встречал.
Может ли программа определить зашумленность изображения? Это может быть идеей для другого проекта, потому что наша модель шумоподавления недостаточно умна для расчета шума. Мы должны сами определять ценности. В этом случае обычно лучше всего попробовать разные значения и найти лучший результат. После некоторой практики вы приобретете больше опыта, и вам будет намного легче найти лучшие значения параметров.
Позвольте мне представить вам этот проект, а затем мы начнем.
Вступление
В этом проекте мы будем использовать три пакета Python: OpenCV, Matplotlib и NumPy. OpenCV — очень известный комплект для компьютерного зрения. В качестве предварительного условия для библиотеки OpenCV нам потребуется установить NumPy. Мы преобразуем пиксели в массивы при чтении изображения. NumPy сделает это за кулисами. NumPy идеально подходит для работы с многомерными массивами.
Модель шумоподавления
А вот и самая важная часть проекта. Сначала я расскажу, какой алгоритм мы собираемся использовать для уменьшения шума. Затем я расскажу, сколько у него параметров и что каждый из них означает.
Желтые области на картинке выглядят одинаково. Кроме того, маленькие зеленые области выглядят одинаково. Алгоритм нелокального уменьшения шума выбирает пиксель, берет небольшое окно вокруг него, сканирует изображение на предмет похожих окон, усредняет все окна и вычисляет результат для замены пикселя. Этот алгоритм описывается как нелокальный, потому что он ищет все изображение, чтобы найти взаимные связи, а не просто осматривать отдельную область. Разве это не круто?
Этот алгоритм содержит две популярные функции: fastNlMeansDenoising и fastNlMeansDenoisingColored . Первая предназначена для изображений в градациях серого, а вторая — для цветных фотографий. В нашем случае мы будем использовать один для цветных изображений.
Параметры функции: src , dst , h , hcolor , templateWindowSize и searchWindowSize .
- src : входное изображение, для которого мы хотим уменьшить шум.
- dst : место назначения, если мы хотим экспортировать результат.
- h : компонент яркости (большее значение h удаляет больше шума, но также может снизить качество изображения).
- hcolor : компонент цвета ( 10 — рекомендованное значение в документации для цветных изображений).
- templateWindowSize : Размер в пикселях области, которую функция будет сглаживать. Это должно быть нечетное целое число.
- searchWindowSize : Размер в пикселях области, которую функция найдет и будет использовать в качестве ссылки. Это влияет на производительность линейно: чем больше searchWindowSize , тем больше время шумоподавления. Кроме того, это должно быть нечетное целое число ( 21 — это рекомендованное значение в официальной документации, поскольку оно подходит для большинства случаев зашумленных изображений).
Шаг 1. Установка пакетов
Нам нужно установить две библиотеки, чтобы наша программа работала: numpy и opencv-python. Мы можем установить их в одну строку с помощью диспетчера библиотек PIP:
pip install numpy opencv-python
Давайте продолжим и создадим новый Jupyter Notebook (но не стесняйтесь использовать среду написания кода, которую хотите). Вот мой первый блокнот, в который мы импортируем только что созданные библиотеки:
import cv2 import numpy as np
Большой! Теперь мы можем перейти к следующему шагу, где мы импортируем и прочитаем изображение.
Шаг 2: Импорт изображения
На этом этапе мы найдем изображение, которое хотим использовать для уменьшения шума. Это может быть шумная картинка, чтобы более четко увидеть изменение. Не стесняйтесь использовать и обычное изображение — плавность все равно будет.
Вот изображение, которое я планирую использовать:
А вот строчка для чтения изображения. Мы используем imread метод OpenCV:
img = cv2.imread("test_image.png")
Теперь перейдем к третьему и заключительному шагу, где мы увидим в действии наше шумоподавление.
Шаг 3: уменьшение шума изображения
Выглядит пока отлично! Теперь это самая интересная часть проекта. Посмотрим, как будет выглядеть картинка после уменьшения шума. Мы запустим функцию с тремя разными значениями, чтобы увидеть, как каждое из них влияет на конечный результат. Не стесняйтесь проверить первый шаг, чтобы понять, что означает каждый параметр.
denoise_1 = cv2.fastNlMeansDenoisingColored(img,None,3,3,7,21) denoise_2 = cv2.fastNlMeansDenoisingColored(img,None,5,5,7,21) denoise_3 = cv2.fastNlMeansDenoisingColored(img,None,15,15,7,21)
Обозначенные изображения присваиваются различным переменным. Сохраним результаты. Мы собираемся использовать метод imwrite OpenCV. Как видите, мы передаем переменную и имя файла, который хотим сохранить.
cv2.imwrite('image_1.png', denoise_1) cv2.imwrite('image_2.png', denoise_2) cv2.imwrite('image_3.png', denoise_3)
Сравнение результатов
Мы можем рассмотреть их по порядку. Чем больше значение, тем более гладким становится изображение.
А вот изображение до и после, чтобы увидеть изменения. Я выбрал denoise_1 в качестве окончательного результата.
Поздравляю! Мы разработали программу, которая снижает шум изображения на разные уровни. Есть много других алгоритмов уменьшения изображения. Вы можете попробовать их и выбрать понравившийся. По моему опыту, они не такие мощные, как тот, который мы использовали в этой статье, а именно алгоритм устранения шумов нелокальных средств. Некоторые алгоритмы шумоподавления также известны как алгоритмы размытия. Это может помочь вам при поиске разных моделей.
Работа над проектами практического программирования, подобными этому, — лучший способ отточить свои навыки программирования. Надеюсь, вам понравилась статья и вы узнали что-то новое сегодня. Спасибо за чтение!
Уроки компьютерного зрения на Python + OpenCV с самых азов. Часть 2
Продолжим изучение компьютерного зрения, которое мы начали на прошлом уроке. Напомню кратко, что там было:
- Этапы обработки и анализа изображений.
- Установка OpenCV.
- Простая программа на OpenCV – отображения картинки в окне.
- Изменение размеров картинки.
- Преобразование из цветного формата в черно-белый.
Как я уже писал в первой части, для того, чтобы удалить из изображения различные шумы, применяют размытие изображение. Например, вот так:
import cv2 my_photo = cv2.imread('MyPhoto.jpg') average_image = cv2.blur(my_photo,(7,7)) cv2.imshow('MyPhoto', average_image) cv2.waitKey(0) cv2.destroyAllWindows()
Вот какой будет эффект от применения данного фильтра:
Но это простой фильтр, он всего лишь усредняет. Более продвинутым считается гауссовский фильтр:
import cv2 my_photo = cv2.imread('MyPhoto.jpg') gaussian_image = cv2.GaussianBlur(my_photo,(7,7),0) cv2.imshow('MyPhoto', gaussian_image ) cv2.waitKey(0) cv2.destroyAllWindows()
Но мы не верим, давайте проверим. Вот результат применения гаусcовского фильтра:
Казалось бы, в чем разница? Второй просто меньше размыл изображение.
Давайте проверим фильтр в деле. Специально испортим изображение:
Пропустим через первый фильтр:
Как видим, дефекты никуда не исчезли, они просто тоже стали размытыми.
Собственно говоря, тоже самое. Да, потому что размытие такие дефекты не удалить. Для этого есть другие фильтры, о которых я расскажу в будущих уроках. Но для чего же тогда применяется размытие? Считается, что для удаление гауссовского шума. Давайте это тоже проверим.
Теперь испортим фотографию путем добавления гауссовского шума, это можно сделать, например, в фотошопе:
Посмотрим, как сработает первый фильтр:
Шум виден, но размытие меньше.
Мы можем увеличить размер окна, например, сделать не 7, а 11:
И по факту у нас получилась первая картинка. Иными словами, гауссовское размытие при большем окне по факту меньше смазывает изображение. Если мы применим усреднение с таким же окном (11 пикселей) то получим вот что:
Таким образом, гаусовский фильтр работает действительно лучше.
Мы научились применять фильтр размытия к изображению для того, чтобы убрать гауссовский шум, и сравнили два фильтра: фильтр усреднения и гауссовский фильтр.