Обработка изображений без OpenCV | python

| | | | | | | | | |

Мы знаем, что OpenCV широко используется для работы с изображениями и имеет для этого широкий набор функций. Но что, если мы хотим обрабатывать файлы изображений без использования какой-либо внешней библиотеки, такой как OpenCV. Давайте посмотрим, как мы можем это сделать.

Масштабирование изображения (с использованием интерполяции ближайшего соседа):

Интерполяция ближайшего соседа — это самый простой способ интерполяции. Этот метод просто определяет «ближайший» соседний пиксель и принимает значение его интенсивности.

Рассмотрите небольшое изображение, ширина которого равна w, а высота — — h, которую мы хотим изменить с ширины p на ширину q, предполагая, что p > m и q > н. Теперь нам нужны две константы масштабирования:

scale_x = p / w scale_y = q / h 

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

Визуальное представление:
Изображение 3Х3 пикселя (всего 9 пикселов), теперь если мы хотим увеличить размер изображения до 6Х6, то по алгоритму ближайшего соседа 6/3 (т.е. 2) пикселя должны иметь такое же значение RGB как и значение пикселя к исходному изображению.

<

Программа масштабирования изображения:


< /tbody>

# использование matplotlib и numpy

import matplotlib.image as img

импортировать <класс кода = "plain"> numpy as npy


# указать местоположение изображения в читаемом виде

m = img.imread ( "taj.png " );


# определение длины исходного изображения

w , h = m.shape [: 2 < класс кода = "обычный">];


# xNew и yNew — новая ширина и
# требуемая высота изображения
после масштабирования

xNew = int (w * 1 / 2 );

yNew = int (h * 1 / 2 );


# вычислить коэффициент масштабирования
# работать более чем на 2 пикселя

xScale = xNew / (w - 1 <класс кода = "обычный">);

yScale = yNew / (h - 1 < /код> <класс кода = "простой">);


# использование numpy, получение матрицы xNew
# ширина и новая высота с
# 4 атрибута [alpha, B, G, B] значения ‚Äã‚Äã

newImage = npy.zeros ([xNew, yNew, 4 ]);


for i in диапазон (xNew - 1 ):

для j in range (yNew - 1 ):

newImage [ i + 1 , j + 1 ] = m [ 1 + int (i / xScale),

1 + int (j / yScale)]


# Сохранить изображение после масштабирования

img.imsave ( `scaled.png ` , newImage);

Вывод:

Оттенки серого изображения:

Использование среднего value, этот метод подчеркивает интенсивность пикселя, а не показывает, из каких значений RGB он состоит. Когда мы вычисляем среднее значение RGB и присваиваем ему значение RGB для пикселя, поскольку значение RGB пикселя одинаково, он не сможет создать какой-либо цвет, так как все цвета генерируются из-за различного соотношения RGB значений, так как в этом случае соотношение было бы 1:1:1. Поэтому визуализированное изображение будет выглядеть серым.

Визуальное представление:

Программа изображений в оттенках серого:


# с использованием NumPy

import numpy as npy


# использование matplotlib

импортировать matplotlib.image as img


# использовать статистику для импорта среднего значения
# для вычисления среднего значения

из статистика импорт означает


m = img.imread ( "taj.png" )


# определяем ширину и высоту исходное изображение

w, h = m .shape [: 2 ]


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

newImage = npy.zeros ([w, h, 4 ])

print (w)

print (h)


for i in range (w):

for j in диапазон (h):

# Соотношение RGB будет между 0 и 1

lst = [ float (m [i] [j] [ 0 ]), float (m [i] [j] [ 1 ]), float (m [i] [j] [ 2 ])]

avg = float (mean (lst) )

newImage [i] [j] [ 0 ] = avg

newImage [i] [j] [ 1 ] = avg

newImage [i] [j] [ 2 ] = avg

newImage [i] [j] [ 3 ] = 1 # значение альфа-канала должно быть 1


# Сохранить изображение с imsave

img.imsave ( `grayedImage.png` , newImage)

Вывод:

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

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

Рассмотрите изображение размером 10 √ó 10 пикселей, и если мы хотим обрезать только центр изображения размером 4 √ó 4 пикселя, затем нам нужно собрать значения пикселей ‚Äã‚Äãот (10-4)/2, начиная с (3, 3) до 4 пикселей в направлении x и 4 пикселя в направлении y.

Визуальное представление:

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


# использование matplotlib и numpy

import matplotlib.image as img

import numpy as npy


# прочитать изображение в переменной m

m = img.imread ( "taj.png" )


# определение размера изображения ширина (w) высота (h)

w, h = m.shape [: 2 ]


# требуемый размер изображения после обрезки

xNew = int (w * 1 / 4 )

yNew = int (h * 1 / 4 )

newImage = npy.zeros ([xNew, yNew, 4 ])


# ширина печати высота исходного изображения

print (w)

print (h)


for i в диапазон ( 1 , xNew):

for j in range ( 1 , yNew):

# обрезать исходное изображение со 100 до 100 пикселей

newImage [i, j] = m [ 100 + i, 100 + j]


# сохранить изображение

img.imsave ( `cropped.png` , newImage)

Вывод:

Обработка изображений без OpenCV | python __del__: Questions

Обработка изображений без OpenCV | python _files: Questions

Shop

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Best laptop for Zoom

$499

Latest questions

NUMPYNUMPY

psycopg2: insert multiple rows with one query

12 answers

NUMPYNUMPY

How to convert Nonetype to int or string?

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Javascript Error: IPython is not defined in JupyterLab

12 answers

Wiki

Python OpenCV | cv2.putText () method

numpy.arctan2 () in Python

Python | os.path.realpath () method

Python OpenCV | cv2.circle () method

Python OpenCV cv2.cvtColor () method

Python - Move item to the end of the list

time.perf_counter () function in Python

Check if one list is a subset of another in Python

Python os.path.join () method