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

Из этой статьи вы узнаете

  • Распространенные методы обработки изображений с использованием PIL и OpenCV, такие как преобразование изображения RGB в изображение в оттенках серого, поворот изображений, уменьшение шума в изображениях, обнаружение краев в изображении и обрезка интересующей области изображения
  • Поиск объектов на изображении с использованием сопоставления шаблонов OpenCV

Необходимые библиотеки:

PIL, OpenCV и imutils

Зачем нужно изучать методы обработки изображений?

Глубокое обучение используется для анализа, идентификации и интеллектуального понимания объектов на изображении. Некоторые из распространенных приложений: Классификация изображений, Обнаружение объектов, Сегментация экземпляров и т.д. присутствовать на изображении или вращать изображение и т. д., чтобы создать лучший набор обучающих данных.

Методы обработки изображений одинаково полезны для оптического распознавания символов (OCR).

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

Код и изображения доступны здесь

Импорт обязательных библиотек

import cv2
from PIL import Image

Сначала отобразим изображение с помощью OpenCV и PIL

Чтение и отображение изображения с помощью OpenCV

# Reading and Displaying the file
image = cv2.imread(r'love.jpg')
cv2.imshow("Image", image)
cv2.waitKey(0)

Если изображение слишком велико, то окно, в котором оно отображается, не умещается на экране.

Так как же вывести на экран полное изображение?

По умолчанию вы получаете обрезанное изображение при отображении слишком большого изображения. Чтобы просмотреть полное изображение, вы будете использовать namedWindow (name, flag) OpenCV для создания нового окна. Первый параметр name - это заголовок окна, который будет использоваться в качестве идентификатора. Если установить для флаг значение cv2.WINDOW_NORMAL, отображается полное изображение, и вы можете изменить размер окна. Есть и другие варианты параметра flag.

# Resizing the image for the user to resize the window 
image = cv2.imread(r'love.jpg')
cv2.namedWindow('Normal Window', cv2.WINDOW_NORMAL)
cv2.imshow('Normal Window', image)
cv2.waitKey(0)

Изменение размера изображения

Когда мы изменяем размер изображения, мы изменяем высоту или ширину изображения, сохраняя соотношение сторон. Соотношение сторон изображения - это отношение ширины изображения к его высоте.

image= cv2.imread(r'taj.jpg')
scale_percent =200 # percent of original size
width = int(image.shape[1] * scale_percent / 100)
height = int(image.shape[0] * scale_percent / 100)
dim = (width, height)
resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
cv2.imshow("Resize", resized)
cv2.waitKey(0)

Чтение и отображение изображения с помощью PIL

Вы загрузите изображение, используя open (), а затем используйте show () для отображения.

изображение. show () создает временный файл.

pil_image= Image.open(r'love.jpg')
pil_image.show("PIL Image")

Что делать, если вы хотите определить края или другие элементы изображения?

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

Изображения RGB имеют три канала: красный, зеленый и синий, по сравнению с двухмерным каналом для изображения в градациях серого. Для изображения в градациях серого будет меньше информации на пиксель по сравнению с цветным изображением, и, следовательно, время обработки изображения в оттенках серого будет быстрее.

Масштабирование серого цветного изображения с помощью OpenCV

Мы преобразуем цветное изображение в оттенки серого с помощью cvtColor (),, который сохранит изображение из одного цветового пространства в другое.

#Converting image to grayscale
image = cv2.imread(r'love.jpg')
gray_image= cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
cv2.namedWindow('Gray Image', cv2.WINDOW_NORMAL)
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)

Масштабирование серого цветного изображения с помощью PIL

convert () возвращает преобразованную копию этого изображения; вы используете режим «L» для оттенков серого и режим «RGB» для цвета.

# Gray image using PIL
pil_image= Image.open(r'love.jpg')
gray_pil=pil_image.convert('L')
gray_pil.show()

Обнаружение краев с использованием OpenCV

Край на изображении обнаруживается с помощью детектора четких краев. Детектор края Canny использует изображение в градациях серого по многоступенчатому алгоритму.

Canny (): первый аргумент - это входное изображение, а второй и третий аргументы - threshold1 и threshold2 значения.

Края с градиентом интенсивности больше порога 2 считаются краями, а те, которые ниже порога 1 - не краями. Не-ребра будут удалены. Любое значение интенсивности градиента между двумя пороговыми значениями классифицируется как ребра или не ребра в зависимости от их связности.

image= cv2.imread(r'taj.jpg')
cv2.namedWindow("Edge", cv2.WINDOW_NORMAL)
denoised_image = cv2.Canny(image, 100,200 )
cv2.imshow("Edge", denoised_image)
cv2.waitKey(0)

Что делать, если изображение перекошено или слегка повернуто, и вы хотите выровнять изображение?

Распознавание текста с перекошенным текстом не работает должным образом, поэтому нам необходимо выполнить выравнивание. Изображения можно выровнять с помощью rotate () OpenCV и PIL.

Поворот изображения с помощью OpenCV

rotate () поворачивает изображение в соответствии с кодом поворота, который указан в качестве второго параметра поворота. функция.

Значения для RotationCode:

  • cv2.ROTATE_90_CLOCKWISE,
  • cv2. ROTATE_90_COUNTERCLOCKWISE
  • cv2.ROTATE_180
#Rotating the image
image = cv2.imread(r'love.jpg')
cv2.namedWindow("Rotated Image", cv2.WINDOW_NORMAL)
rotated_img= cv2.rotate(image,cv2.ROTATE_90_CLOCKWISE )
cv2.imshow("Rotated Image", rotated_img)
cv2.waitKey(0)

Что, если я хочу повернуть изображение только на определенный угол?

Поворот изображения под определенным углом

В приведенном ниже коде изображение поворачивается с шагом 60 градусов с помощью rotate () из imutils.

import imutils
import numpy as np
image = cv2.imread(r'love.jpg')
# loop over the rotation angles
for angle in np.arange(0, 360, 60):
    cv2.namedWindow("Rotated", cv2.WINDOW_NORMAL)
    rotated = imutils.rotate(image, angle)
    cv2.imshow("Rotated", rotated)
    cv2.waitKey(0)

Поворот изображения с помощью PIL

Здесь изображение повернуто на 110 градусов с помощью PIL.

# Rotate image using PIL
pil_image= Image.open(r'love.jpg')
rotate_img_pil=pil_image.rotate(110)
rotate_img_pil.show()

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

Удаление шумов изображения с помощью OpenCV

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

Минимизация шума, присутствующего в изображении, с помощью OpenCV.

image= cv2.imread(r'taj.jpg')
cv2.namedWindow("Noised Image", cv2.WINDOW_NORMAL)
cv2.imshow("Noised Image", image)
cv2.waitKey(0)

В OpenCV есть разные методы удаления шума с изображений. Ниже используется cv.fastNlMeansDenoisingColored (), который предназначен для удаления шума из цветного изображения.

Общие аргументы для методов fastNIMeansDenoising:

  • src: исходное изображение
  • dst: вывод изображения того же размера и типа, что и src.
  • h: регулирует силу фильтра. Более высокое значение h отлично удаляет шум вместе с деталями изображения, меньшее значение h сохранит детали изображения вместе с некоторым шумом.
  • hForColorComponents: то же, что и h, но только для цветных изображений, обычно совпадает с h
  • templateWindowSize: должно быть нечетным. (рекомендуется 7)
  • searchWindowSize: должно быть нечетным. (рекомендуется 21)
image= cv2.imread(r'taj.jpg')
cv2.namedWindow("Denoised Image", cv2.WINDOW_NORMAL)
denoised_image = cv2.fastNlMeansDenoisingColored(image,None, h=5)
cv2.imshow("Denoised Image", denoised_image)
cv2.waitKey(0)

Как выделить из изображения определенные области, представляющие интерес?

Обрезка изображения

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

Мы обрежем изображение Тадж-Махала и оставим только Тадж-Махал и удалим другие детали с изображения.

Обрезка изображения с помощью OpenCV

Обрезка в OpenCV выполняется путем нарезки массива изображений, в котором мы передаем начало и конец координат y, за которыми следуют начало и конец координат x.

изображение [y_start: y_end, x_start: x_end]

image= cv2.imread(r'taj.jpg')
resized_img= image[15:170, 20:200]
cv2.imshow("Resize", resized_img)
cv2.waitKey(0)

Обрезка изображения с помощью PIL

crop () PIL позволяет нам обрезать прямоугольную область изображения. Параметр crop () - это левая координата, верхняя координата, правая координата и координата нижнего пикселя.

# Opens a image in RGB mode 
pil_image = Image.open(r'taj.jpg') 
  
# Get the Size of the image in pixels 
width, height = pil_image.size 
  
# Setting the cropped image co-ordinates
left = 3
top = height /25
right = 200
bottom = 3 * height / 4
  
# Crop the  image based on the above dimension 
cropped_image = pil_image.crop((left, top, right, bottom))
  
# Shows the image in image viewer 
cropped_image.show()

Соответствие шаблона

Вы можете предоставить шаблон и выполнить поиск этого шаблона на изображении и извлечь его местоположение с помощью matchTemplate () OpenCV.

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

minMaxLoc () используется для получения максимального / минимального значения, которое будет верхним левым углом прямоугольника вместе с шириной и высотой.

Доступно 6 методов сопоставления с шаблоном

  • cv2.TM_SQDIFF
  • cv2.TM_SQDIFF_NORMED
  • cv2.TM_CCORR
  • cv2.TM_CCORR_NORMED
  • cv2.TM_CCOEFF
  • cv2.TM_CCOEFF_NORMED

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

Для сопоставления с шаблоном используется метод TM_CCOEFF_NORMED. Порог совпадения установлен на 0,95. Он локализует местоположение с более высокой вероятностью совпадения, превышающей 95%, а затем рисует прямоугольник вокруг области, соответствующей совпадению.

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread(r'love.jpg',0)
cv2.imshow("main",img)
cv2.waitKey(0)
template = cv2.imread(r'template1.png',0)
cv2.imshow("Template",template)
cv2.waitKey(0)
w, h = template.shape[::-1]
methods = [ 'cv2.TM_CCOEFF_NORMED']
for meth in methods:
    
    method = eval(meth)
# Apply template Matching
    res = cv2.matchTemplate(img,template,method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    threshold=0.95
    loc=np.where(res>threshold)
    if len(loc[0])>0:
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
        if method in [ cv2.TM_SQDIFF_NORMED]:
            top_left = min_loc
        bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img,top_left, bottom_right,100,20)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
        plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
        plt.subplot(122),plt.imshow(img,cmap = 'gray')
        plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
        plt.suptitle(meth)
plt.show()
    else:
        print("Template not matched")

Вывод:

Мы обсудили наиболее распространенные методы обработки изображений, которые можно использовать для анализа изображений для классификации изображений, обнаружения объектов, а также для распознавания текста.

Использованная литература:





Https://opencv-python-tutroals.readthedocs.io/en/latest/