Рубрики

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

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

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

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

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

scale_x = p/w
scale_y = q/h

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

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

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

# используя matplotlib и numpy

  

import matplotlib.image as img

import numpy as npy

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

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

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

w, h = m.shape[:2];

  
# xNew и yNew - новая ширина и
# высота изображения требуется
after scaling

xNew = int(w * 1 / 2);

yNew = int(h * 1 / 2);

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

xScale = xNew/(w-1);

yScale = yNew/(h-1);

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

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

  

for i in range(xNew-1):

   for j in range(yNew-1):

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

                                 1 + int(j / yScale)]

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

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

Выход:

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

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

Наглядное представление:

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

# используя NumPy

import numpy as npy

  
# используя matplotlib

import matplotlib.image as img

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

from statistics import mean 

  

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 range(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 пикселя в направлении х и 4 пикселя в направлении у .

Наглядное представление:

Программа для обрезки изображения:

# используя matplotlib и numpy

import matplotlib.image as img

import numpy as npy

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

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

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

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 in range(1, xNew):

    for j in range(1, yNew):

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

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

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

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

Выход:

Рекомендуемые посты:

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

0.00 (0%) 0 votes