Примечание: в этом посте мы будем работать только с изображениями в оттенках серого, чтобы упростить понимание.
Изображение можно рассматривать как матрицу значений, где каждое значение представляет интенсивность пикселя. Существует три основных типа форматов изображений:
Фильтры — это инструменты, используемые для изменения изображений путем применения определенных операций. Фильтр — это матрица (также называемая ядром), которая перемещается по изображению, выполняя вычисления над значениями пикселей в своем окне. Мы рассмотрим два распространенных типа фильтров: средние фильтры и медианные фильтры.
Средний фильтр используется для уменьшения шума путем усреднения значений пикселей в окне. Он заменяет центральный пиксель в окне средним значением всех пикселей в этом окне. Функция cv2.blur() применяет фильтр среднего значения с размером ядра 3x3, что означает, что она рассматривает окно пикселей 3x3 вокруг каждого пикселя для вычисления среднего значения. Это помогает сгладить изображение.
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) # Applies a Mean Filter of size 3 x 3 blurred_image = cv2.blur(image, (3, 3)) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(blurred_image, cmap='gray') plt.title('Mean Filtered Image') plt.axis("off") plt.show()
Медианный фильтр используется для уменьшения шума путем замены значения каждого пикселя медианным значением всех пикселей в окне. Он особенно эффективен при удалении шума «соль и перец». Функция cv2.medianBlur() применяет медианный фильтр с размером ядра 3. Этот метод заменяет каждый пиксель медианным значением значений пикселей в его окрестностях, что помогает сохранить края при удалении шума. Здесь, чем больше размер ядра, тем более размытым становится изображение.
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) # Applies a Median Filter with a kernel size of 3 blurred_image = cv2.medianBlur(image, 3) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(blurred_image, cmap='gray') plt.title('Median Filtered Image') plt.axis("off") plt.show()
Вы можете создавать собственные фильтры для применения определенных операций к вашим изображениям. Функция cv2.filter2D() позволяет применить к изображению любое пользовательское ядро. Функция cv2.filter2D() применяет к изображению собственное ядро (фильтр). Ядро — это матрица, определяющая операцию, выполняемую над значениями пикселей. В этом примере ядро улучшает определенные функции изображения на основе указанных значений.
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) # Define a custom filter kernel kernel = np.array([[2, -1, 5], [-5, 5, -1], [0, -1, 0]]) filtered_image = cv2.filter2D(image, -1, kernel) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis('off') plt.subplot(1, 2, 2) plt.imshow(filtered_image, cmap='gray') plt.title('Filtered Image') plt.axis('off') plt.show()
Примечание: во фрагментах кода вы увидите _ , image при назначении порогового изображения. Это связано с тем, что функция cv2.threshold возвращает два значения: используемое пороговое значение и пороговое изображение. Поскольку нам нужно только изображение с пороговым значением, мы используем _, чтобы игнорировать пороговое значение.
Пороговое значение преобразует изображение в двоичное изображение, устанавливая значения пикселей на основе условия. Существует несколько типов методов определения порога:
Этот метод устанавливает фиксированное пороговое значение для всего изображения. Пикселям со значениями выше порогового значения присваивается максимальное значение (255), а для пикселей ниже — 0. Функция cv2.threshold() используется для простого определения порога. Пиксели с интенсивностью больше 127 становятся белыми (255), а пиксели с интенсивностью меньше или равными 127 — черными (0), создавая двоичное изображение.
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) _, thresholded_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(thresholded_image, cmap='gray') plt.title('Thresholded Image') plt.axis("off") plt.show()
Метод Оцу автоматически определяет оптимальное пороговое значение на основе гистограммы изображения. Этот метод минимизирует внутриклассовую дисперсию и максимизирует межклассовую дисперсию. Установив пороговое значение равным 0 и используя cv2.THRESH_OTSU, функция автоматически вычисляет лучшее пороговое значение для отделения переднего плана от фона.
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) _, otsu_thresholded_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(otsu_thresholded_image, cmap='gray') plt.title("Otsu's Thresholded Image") plt.axis("off") plt.show()
При использовании среднего адаптивного порога пороговое значение для каждого пикселя рассчитывается на основе среднего значения пикселей в локальной окрестности вокруг этого пикселя. Этот метод динамически регулирует порог в разных областях изображения. Функция cv2.adaptiveThreshold() вычисляет порог для каждого пикселя на основе среднего значения значений пикселей в локальном окружении 11x11. Постоянное значение 2 вычитается из этого среднего значения для точной настройки порога. Этот метод эффективен для изображений с переменным освещением.
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) mean_adaptive_thresholded_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(mean_adaptive_thresholded_image, cmap='gray') plt.title('Mean Adaptive Thresholded Image') plt.axis("off") plt.show()
Адаптивное пороговое значение по Гауссу вычисляет пороговое значение для каждого пикселя на основе взвешенной по Гауссу суммы значений пикселей в локальной окрестности. Этот метод часто дает лучшие результаты в случаях с неравномерной освещенностью. В адаптивном пороге Гаусса порог определяется взвешенной по Гауссу суммой значений пикселей в окрестности 11x11. Постоянное значение 2 вычитается из этого взвешенного среднего значения для настройки порога. Этот метод полезен для обработки изображений с различным освещением и тенями.
import cv2 import matplotlib.pyplot as plt image = cv2.imread('McLaren-720S-Price-1200x675.jpg', cv2.IMREAD_GRAYSCALE) gaussian_adaptive_thresholded_image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.axis("off") plt.subplot(1, 2, 2) plt.imshow(gaussian_adaptive_thresholded_image, cmap='gray') plt.title('Gaussian Adaptive Thresholded Image') plt.axis("off") plt.show()
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3