Разное

Python работа с изображениями: Играемся с изображениями в Python / Хабр

Содержание

Играемся с изображениями в Python / Хабр

В этой статье я хотел бы разобрать различные способы преобразования изображений с помощью Python. Для примеров я решил взять несколько наиболее известных. В статье не будет ничего сложного, она ориентированна в основном на новичков.
Картинка для испытаний:

Подготовка
import random
from PIL import Image, ImageDraw #Подключим необходимые библиотеки. 

mode = int(input('mode:')) #Считываем номер преобразования. 
image = Image.open("temp.jpg") #Открываем изображение. 
draw = ImageDraw.Draw(image) #Создаем инструмент для рисования. 
width = image.size[0] #Определяем ширину. 
height = image.size[1] #Определяем высоту. 	
pix = image.load() #Выгружаем значения пикселей.

Оттенки серого

Для получения этого преобразования необходимо «усреднить» каждый пиксел.

if (mode == 0):
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			S = (a + b + c) // 3
			draw.point((i, j), (S, S, S))

Сепия

Чтобы получить сепию, нужно посчитать среднее значение и взять какой — нибудь коэффициент.
middle = (R + G + B) / 3
Первое значение пиксела ( R ) = middle + 2 * k
Второе значение пиксела ( G ) = middle + k
Третье значение пиксела ( B ) = middle

if (mode == 1):
	depth = int(input('depth:'))
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			S = (a + b + c) // 3
			a = S + depth * 2
			b = S + depth
			c = S
			if (a > 255):
				a = 255
			if (b > 255):
				b = 255
			if (c > 255):
				c = 255
			draw.point((i, j), (a, b, c))

depth = 30

Негатив

Теперь научимся получать негатив.
Это очень просто, достаточно лишь каждое значение пиксела вычесть из 255.

if (mode == 2):
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			draw.point((i, j), (255 - a, 255 - b, 255 - c))

Добавление шумов

Вот тут совсем всё просто.
Мы будем всегда добавлять к пикселу какое — нибудь рандомное значение. Чем больше разброс этих значений, тем больше шумов.

if (mode == 3):
	factor = int(input('factor:'))
	for i in range(width):
		for j in range(height):
			rand = random.randint(-factor, factor)
			a = pix[i, j][0] + rand
			b = pix[i, j][1] + rand
			c = pix[i, j][2] + rand
			if (a < 0):
				a = 0
			if (b < 0):
				b = 0
			if (c < 0):
				c = 0
			if (a > 255):
				a = 255
			if (b > 255):
				b = 255
			if (c > 255):
				c = 255
			draw.point((i, j), (a, b, c))

factor = 70

Яркость

Для регулирования яркости к каждому пикселу мы будем добавлять определенное значение. Если оно > 0, то картинка становится ярче, иначе темнее.

if (mode == 4):
	factor = int(input('factor:'))
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0] + factor
			b = pix[i, j][1] + factor
			c = pix[i, j][2] + factor
			if (a < 0):
				a = 0
			if (b < 0):
				b = 0
			if (c < 0):
				c = 0
			if (a > 255):
				a = 255
			if (b > 255):
				b = 255
			if (c > 255):
				c = 255
			draw.point((i, j), (a, b, c))

factor = 100

factor = -100

Чёрно — белое изображение

Теперь все пикселы надо разбить на 2 группы: черные и белые.
Для проверки принадлежности к определенной группе мы будем смотреть к чему ближе значение пиксела: к белому цвету или к чёрному.

if (mode == 5):
	factor = int(input('factor:'))
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			S = a + b + c
			if (S > (((255 + factor) // 2) * 3)):
				a, b, c = 255, 255, 255
			else:
				a, b, c = 0, 0, 0
			draw.point((i, j), (a, b, c))

factor = 100

Заключение

Сохраняем результат и удаляем кисть.

image.save("ans.jpg", "JPEG")
del draw

Окончательный код

import random
from PIL import Image, ImageDraw  

mode = int(input('mode:'))  
image = Image.open("temp.jpg")  
draw = ImageDraw.Draw(image)  
width = image.size[0]  
height = image.size[1]  	
pix = image.load() 
if (mode == 0):
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			S = (a + b + c) // 3
			draw.point((i, j), (S, S, S))
if (mode == 1):
	depth = int(input('depth:'))
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			S = (a + b + c) // 3
			a = S + depth * 2
			b = S + depth
			c = S
			if (a > 255):
				a = 255
			if (b > 255):
				b = 255
			if (c > 255):
				c = 255
			draw.point((i, j), (a, b, c))
if (mode == 2):
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			draw.point((i, j), (255 - a, 255 - b, 255 - c))
if (mode == 3):
	factor = int(input('factor:'))
	for i in range(width):
		for j in range(height):
			rand = random.randint(-factor, factor)
			a = pix[i, j][0] + rand
			b = pix[i, j][1] + rand
			c = pix[i, j][2] + rand
			if (a < 0):
				a = 0
			if (b < 0):
				b = 0
			if (c < 0):
				c = 0
			if (a > 255):
				a = 255
			if (b > 255):
				b = 255
			if (c > 255):
				c = 255
			draw.point((i, j), (a, b, c))
if (mode == 4):
	factor = int(input('factor:'))
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0] + factor
			b = pix[i, j][1] + factor
			c = pix[i, j][2] + factor
			if (a < 0):
				a = 0
			if (b < 0):
				b = 0
			if (c < 0):
				c = 0
			if (a > 255):
				a = 255
			if (b > 255):
				b = 255
			if (c > 255):
				c = 255
			draw.point((i, j), (a, b, c))
if (mode == 5):
	factor = int(input('factor:'))
	for i in range(width):
		for j in range(height):
			a = pix[i, j][0]
			b = pix[i, j][1]
			c = pix[i, j][2]
			S = a + b + c
			if (S > (((255 + factor) // 2) * 3)):
				a, b, c = 255, 255, 255
			else:
				a, b, c = 0, 0, 0
			draw.point((i, j), (a, b, c))
image.save("ans.jpg", "JPEG")
del draw

Python. Работа с изображениями — wiki Programming Store

Для работы с графическими изображениями в Python есть ряд библиотек, в частности, библиотека Pyllow. Если у вас уже установлен pip то поставить Pillow не составит труда, просто используем команду python -m pip install pillow, которая автоматически скачает и установит библиотеку. Для использования библиотек просто подключаем ее через  импорт:

Самым важным классом в этой библиотеке — Image. Вот простейший пример использования, грузим картинку и отображаем ее на экране:

from PIL import Image
img=Image.open(‘d:\\3\\10300013.png’)
img.show()



from PIL import Image

img=Image.open(‘d:\\3\\10300013.png’)

img.show()

Отобразит Python картинку, правда, стандартными средствами операционной системы, просто показав окно с картинкой.

А теперь чуть более сложный пример. Пусть у нас есть два изображения, такое:

И такое:

Объединим их, используя интерполяцию между новым и старым:

from PIL import Image
im1 = Image.open(‘d:\\3\\10300013.png’)
im2 = Image.open(‘d:\\3\\10300014.png’)
Image.blend(im1, im2, 50).show()



from PIL import Image

im1 = Image.open(‘d:\\3\\10300013.png’)

im2 = Image.open(‘d:\\3\\10300014.png’)

Image.blend(im1, im2, 50).show()

Получив вот такой вот результат:

Третий параметр — это альфа. Попробуем поиграться с ним, задами, например 5:

Или вообще 2:

Возможно, на данном примере не совсем понятно. Хорошо, попробуем изображения попроще. Вот у нас две картинки:

Наложим их друг на друга методом blend с альфой 2:

Поменяем местами:

Библиотека позволяет также формировать изображения и сохранять их в файл:

from PIL import Image
from PIL import ImageDraw

text = «This is text»
color = (0, 0, 120)
img = Image.new(‘RGB’, (100, 50), color)
imgDrawer = ImageDraw.Draw(img)
imgDrawer.text((10, 20), text)
img.save(«d:\\1\\pil-example.png»)



from PIL import Image

from PIL import ImageDraw

 

text = «This is text»

color = (0, 0, 120)

img = Image.new(‘RGB’, (100, 50), color)

imgDrawer = ImageDraw.Draw(img)

imgDrawer.text((10, 20), text)

img.save(«d:\\1\\pil-example.png»)

Вот что сделает данный код:

Только на этот раз изображение будет не на экран выведено, а в файл по указанному пути.

Выведем формат, тип, размер изображения:

from PIL import Image
from PIL import ImageDraw

img = Image.open(‘d:\\3\\lena.jpg’) #открываем картинку
size = img.size #размер картинки
format = img.format #формат картинки
mode = img.mode #мод(RGBA…)
arr = [] #создаем пустой массив
arr.append(size) #добавляем размер в массив
arr.append(format) #добавляем формат в массив
arr.append(mode) #добавляем мод в массив
print(arr) #выводим массив



from PIL import Image

from PIL import ImageDraw

 

img = Image.open(‘d:\\3\\lena.jpg’) #открываем картинку

size = img.size #размер картинки

format = img.format #формат картинки

mode = img.mode #мод(RGBA…)

arr = [] #создаем пустой массив

arr.append(size)  #добавляем размер в массив

arr.append(format) #добавляем формат в массив

arr.append(mode)  #добавляем мод в массив

print(arr) #выводим массив

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

from PIL import Image
from PIL import ImageDraw

img = Image.open(‘d:\\3\\lena.jpg’) #открываем картинку
img.save(‘d:\\3\\test.gif’)



from PIL import Image

from PIL import ImageDraw

 

img = Image.open(‘d:\\3\\lena.jpg’) #открываем картинку

img.save(‘d:\\3\\test.gif’)

Возможны и геометрические преобразования изображений, например, поворот на угол:

from PIL import Image
from PIL import ImageDraw

img = Image.open(‘d:\\3\\lena.jpg’) #открываем картинку
out = img.resize((128, 128))
out = img.rotate(25) # degrees counter-clockwise
out.show()



from PIL import Image

from PIL import ImageDraw

 

img = Image.open(‘d:\\3\\lena.jpg’) #открываем картинку

out = img.resize((128, 128))

out = img.rotate(25) # degrees counter-clockwise

out.show()

Результатом работы данной программы будет повернутое изображение:

На этом пока все, но продолжение следует.

Работа с изображениями в Python

PIL — это библиотека изображений Python, которая предоставляет интерпретатору Python возможности редактирования изображений. Он был разработан Фредриком Лундом и несколькими другими участниками. Pillow — это удобный PIL-форк и простая в использовании библиотека, разработанная Алексом Кларком и другими участниками. Мы будем работать с подушкой.

Установка:

  • Linux: В терминале Linux введите следующее:
    pip install Pillow

    Установка пипса через терминал:

    sudo apt-get update
    sudo apt-get install python-pip
  • Windows: Загрузите соответствующий пакет Pillow в соответствии с вашей версией Python. Обязательно загрузите в соответствии с имеющейся у вас версией Python.

Здесь мы будем работать с модулем Image, который предоставляет класс с тем же именем и предоставляет множество функций для работы с нашими изображениями. Чтобы импортировать модуль Image, наш код должен начинаться со следующей строки:

 from PIL import Image

Операции с изображениями:

  • Откройте определенное изображение из пути:

       

    try

        img  = Image.open(path) 

    except IOError:

        pass

  • Получить размер изображения . Созданные экземпляры класса Image имеют много атрибутов, одним из его полезных атрибутов является размер.

    from PIL import Image

      

    filename = "image.png"

    with Image.open(filename) as image:

        width, height = image.size

    Некоторые другие атрибуты: Image.width, Image.height, Image.format, Image.info и т. Д.

  • Сохранение изменений в изображении: чтобы сохранить любые изменения, которые вы внесли в файл изображения, нам нужно указать путь, а также формат изображения.

    img.save(path, format)    

  • Поворот изображения. Вращению изображения необходим угол в качестве параметра для поворота изображения.

    from PIL import Image

      

    def main():

        try:

            

            img = Image.open("picture.jpg"

              

            

            img = img.rotate(180

              

             

            img.save("rotated_picture.jpg")

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

    Примечание. В качестве одного из аргументов метода rotate доступен необязательный флаг расширения, который, если задано значение true, расширяет выходное изображение, чтобы сделать его достаточно большим, чтобы вместить полностью повернутое изображение.
    Как видно из приведенного выше фрагмента кода, я использовал относительный путь, где мое изображение находится в том же каталоге, что и мой файл кода Python, также можно использовать абсолютный путь.

  • Обрезка изображения: Image.crop (прямоугольник) принимает четырехпиксельную (левую, верхнюю, правую, нижнюю) координату пикселя и возвращает прямоугольную область из использованного изображения.

    from PIL import Image

      

    def main():

        try:

            

            img = Image.open("picture.jpg")

            width, height = img.size

              

            area = (0, 0, width/2, height/2)

            img = img.crop(area)

              

            

            img.save("cropped_picture.jpg"

              

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

  • Изменение размера изображения: Image.resize (размер) — здесь размер указывается в виде ширины и высоты в 2 кортежа.

    from PIL import Image

      

    def main():

        try:

             

            img = Image.open("picture.jpg")

            width, height = img.size

       

            img = img.resize((width/2, height/2))

              

            

            img.save("resized_picture.jpg"

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

  • Вставка изображения в другое изображение: вторым аргументом может быть 2-кортеж (с указанием верхнего левого угла) или 4-кортеж (слева, сверху, справа, снизу) — в этом случае размер вставляемого изображения должен соответствовать размер этой области блока, или Нет, что эквивалентно (0, 0).

    from PIL import Image

      

    def main():

        try:

            

            

            img = Image.open("picture.jpg"

              

            

            

            img2 = Image.open("picture2.jpg"

            img.paste(img2, (50, 50))

              

            

            img.save("pasted_picture.jpg")

              

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

      

  • Получение гистограммы изображения. Возвращает гистограмму изображения в виде списка количества пикселей, по одному на каждый пиксель изображения. (Гистограмма изображения — это графическое представление тонального распределения в цифровом изображении. Оно содержит все значения яркости, содержащиеся в изображении. Оно отображает количество пикселей для каждого значения яркости. Это помогает выполнять настройки экспозиции. .)
    из PIL import Image

    def main():

        try:

            

            img = Image.open("picture.jpg"

              

            

            print img.histogram()

              

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

  • Транспонирование изображения: эта функция дает нам зеркальное отображение изображения

        from PIL import Image

      

    def main():

        try:

            

            img = Image.open("picture.jpg"

              

            

            transposed_img = img.transpose(Image.FLIP_LEFT_RIGHT)

              

            

            transposed_img.save("transposed.jpg")

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

  • Разделить изображение на отдельные полосы. При разбиении изображения в режиме RGB создаются три новых изображения, каждое из которых содержит копию исходных отдельных полос.

    from PIL import Image

      

    def main():

        try:

            

            img = Image.open("picture.jpg"

              

            

            print img.split()

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

  • tobitmap: преобразование изображения в растровое изображение X11 (простой текстовый двоичный формат изображения). Возвращает строку, содержащую растровое изображение X11, ее можно использовать только для изображений в режиме «1», то есть для черно-белых изображений с 1-битным пикселем.
    из PIL import Image

    def main():

        try:

            

            img = Image.open("picture.jpg"

            print img.mode

              

            

            print img.tobitmap()

              

            print type(img.tobitmap())

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

  • Создание миниатюры. Этот метод создает миниатюру открытого изображения. Он не возвращает новый объект изображения, он вносит изменения на месте самого открытого в данный момент объекта изображения. Если вы не хотите изменять исходный объект изображения, создайте копию, а затем примените этот метод. Этот метод также оценивает целесообразность поддержания соотношения сторон изображения в соответствии с переданным размером.
    из PIL import Image

    def main():

        try:

            

            img = Image.open("picture.jpg"

              

            

            img.thumbnail((200, 200)) 

              

            img.save("thumb.jpg")

        except IOError:

            pass

      

    if __name__ == "__main__":

        main()

Эта статья предоставлена Мохитом Агарвалом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи [email protected] Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

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

Работа с изображениями в Python

0.00 (0%) 0 votes

библиотека PIL. Работа с изображениями в Python

Для работы с изображениями в Python наиболее часто используют библиотеку PIL (Python Image Library). В этой статье рассмотрим базовые возможности данной библиотеки, применяемые наиболее часто. Для установки библиотеки скачивайте файл PIL-1.2.6.win32-py2.6.exe с официального сайта библиотеки а затем запускайте уже знакомую для вас установку. Процесс установки очень прост и в комментариях не нуждается. Чтобы проверить работоспособность библиотеки и узнать удачно ли она установилась, в окне Python Shell редактора IDLE наберите следующий код.

>>> from PIL import Image
>>> Image.VERSION
'1.1.6'

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

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

Загрузка готового изображения

Для открытия файла с готовым изображением применяется функция open(). Функция возвращает объект, с помощью которого производится дальнейшая работа с изображением. Если открыть файл с изображением не удалось, возбуждается исключение IOError. Формат функции:

open(<Путь или файловый объект>[, mode='r'])

В первом параметре можно указать абсолютный путь или относительный путь к изображению. Откроем файл Forest-large.jpg, который расположен в том же рабочем каталоге, что и сам скрипт.

>>> img = Image.open("Forest-large.jpg")

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

>>> f = open("foto.gif", "rb") # Открываем файл в бинарном режиме
>>> img = Image.open(f)        # Передаем объект файла
>>> img.size                   # Получаем размер изображения
(800, 600)
>>> f.close()                  # Закрываем файл

Если изображение было загружено в какую-либо переменную, то можно создать файловый объект с помощью модуля StringIO и передать его в функцию open(). Язык программирования Python имеет много интересных библиотек для работы с видео, музыкой и обработка профессиональных фотографии. Работая над длинной программой код будет удлинятся все глубже и на маленьком экране ноутбука неудобно писать длинные программы. Чтобы расширить свою зону видимости кода нужно подключить второй монитор к ноутбуку и работать уже на широком 22 дюймовом мониторе. Тогда при редактировании видео и изображении на Python ваш результат будет лучше анализированным визуально на широком мониторе чем на ноутбуке.

Загрузка изображения из строки

>>> f = open("foto.gif", "rb") # Открываем файл в бинарном режиме
>>> i = f.read()               # Сохраняем изображение в переменной
>>> f.close()                  # Закрываем файл
>>> import StringIO            # Подключаем модуль StringIO
>>> img = Image.open(StringIO.StringIO(i)) # Передаем объект
>>> img.format                 # Выводим формат изображения
'GIF'

Как видно из примера, формат изображения определяется автоматически. Следует также заметить, что после открытия файла с помощью функции open() само изображение не загружается сразу в память из файла. Загрузка изображения производится при первой операции с изображением. Загрузить изображение явным образом позволяет метод load(). Хотя в большинстве случаев это делать не нужно. Начиная с версии 1.1.6 метод load() возвращает объект, с помощью которого можно получить доступ к определенным пикселям изображения.

Python. Работа с изображениями в tkinter.

На уроке Python. Работа с изображениями мы с вами научились загружать и отображать картинки, а также всяко извращаться с ними. Это мы делали при помощи библиотеки PIL.  На уроке Python. GUI мы с вами при помощи библиотеки tkinter создавали виндовый интерфейс программы: всякие кнопочки, флажки, и прочие элементы управления. Но возникает вопрос: а нельзя ли при помощи tkinter как-то выводить изображение на виндовую форму? Можно. Например вот такая программа:

import tkinter
from PIL import Image, ImageTk

root = tkinter.Tk()

# создаем рабочую область
frame = tkinter.Frame(root)
frame.grid()

#Добавим метку
label = tkinter.Label(frame, text=»Hello, World!»).grid(row=1,column=1)


# вставляем кнопку
but = tkinter.Button(frame, text=»Кнопка»).grid(row=1, column=2)

#Добавим изображение
canvas = tkinter.Canvas(root, height=400, width=700)
image = Image.open(«d:/3/Dscn0116.jpg»)
photo = ImageTk.PhotoImage(image)
image = canvas.create_image(0, 0, anchor=’nw’,image=photo)
canvas.grid(row=2,column=1)
root.mainloop()


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

import tkinter

from PIL import Image, ImageTk

 

root = tkinter.Tk()

 

# создаем рабочую область

frame = tkinter.Frame(root)

frame.grid()

 

#Добавим метку

label = tkinter.Label(frame, text=»Hello, World!»).grid(row=1,column=1)

 

 

# вставляем кнопку

but = tkinter.Button(frame, text=»Кнопка»).grid(row=1, column=2)

 

#Добавим изображение

canvas = tkinter.Canvas(root, height=400, width=700)

image = Image.open(«d:/3/Dscn0116.jpg»)

photo = ImageTk.PhotoImage(image)

image = canvas.create_image(0, 0, anchor=’nw’,image=photo)

canvas.grid(row=2,column=1)

root.mainloop()

выдаст вот такое окно:

Что интересно, PIL здесь нужен, чтобы загружать изображения типа jpg, gif-ы и png можно открыть и без него:

import tkinter

root = tkinter.Tk()

# создаем рабочую область
frame = tkinter.Frame(root)
frame.grid()

#Добавим метку
label = tkinter.Label(frame, text=»Hello, World!»).grid(row=1,column=1)


# вставляем кнопку
but = tkinter.Button(frame, text=»Кнопка»).grid(row=1, column=2)

#Добавим изображение
canvas = tkinter.Canvas(root, height=400, width=700)
img = tkinter.PhotoImage(file = ‘d:/3/Dscn0116.png’)
image = canvas.create_image(0, 0, anchor=’nw’,image=img)
canvas.grid(row=2,column=1)
root.mainloop()


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import tkinter

 

root = tkinter.Tk()

 

# создаем рабочую область

frame = tkinter.Frame(root)

frame.grid()

 

#Добавим метку

label = tkinter.Label(frame, text=»Hello, World!»).grid(row=1,column=1)

 

 

# вставляем кнопку

but = tkinter.Button(frame, text=»Кнопка»).grid(row=1, column=2)

 

#Добавим изображение

canvas = tkinter.Canvas(root, height=400, width=700)

img = tkinter.PhotoImage(file = ‘d:/3/Dscn0116.png’)

image = canvas.create_image(0, 0, anchor=’nw’,image=img)

canvas.grid(row=2,column=1)

root.mainloop()

А теперь попробуем при нажатии на кнопку сменить изображение:

import tkinter
from PIL import Image, ImageTk

root = tkinter.Tk()

# создаем рабочую область
frame = tkinter.Frame(root)
frame.grid()

# Добавим метку
label = tkinter.Label(frame, text=»Hello, World!»).grid(row=1, column=1)

image = Image.open(«d://1//DSCN1128.png»)
photo = ImageTk.PhotoImage(image)


def my_event_handler():
print(«my_event_handler»)
image = Image.open(«d://1//original.jpg»)
photo = ImageTk.PhotoImage(image)
image = canvas.create_image(0, 0, anchor=’nw’, image=photo)
canvas.grid(row=2, column=1)


# вставляем кнопку
but = tkinter.Button(frame, text=»Кнопка», command=my_event_handler).grid(row=1, column=2)

# Добавим изображение
canvas = tkinter.Canvas(root, height=400, width=700)
image = canvas.create_image(0, 0, anchor=’nw’, image=photo)
canvas.grid(row=2, column=1)
root.mainloop()


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

import tkinter

from PIL import Image, ImageTk

 

root = tkinter.Tk()

 

# создаем рабочую область

frame = tkinter.Frame(root)

frame.grid()

 

# Добавим метку

label = tkinter.Label(frame, text=»Hello, World!»).grid(row=1, column=1)

 

image = Image.open(«d://1//DSCN1128.png»)

photo = ImageTk.PhotoImage(image)

 

 

def my_event_handler():

    print(«my_event_handler»)

    image = Image.open(«d://1//original.jpg»)

    photo = ImageTk.PhotoImage(image)

    image = canvas.create_image(0, 0, anchor=’nw’, image=photo)

    canvas.grid(row=2, column=1)

 

 

# вставляем кнопку

but = tkinter.Button(frame, text=»Кнопка», command=my_event_handler).grid(row=1, column=2)

 

# Добавим изображение

canvas = tkinter.Canvas(root, height=400, width=700)

image = canvas.create_image(0, 0, anchor=’nw’, image=photo)

canvas.grid(row=2, column=1)

root.mainloop()

Но не тут то было. При нажатии на кнопку изображение не меняется. Хотя, казалось бы, все написано правильно, и наш обработчик событий работает, наше сообщение, что мы выводим командой print выводится в окно сообщений. В чем же дело? А дело в сборщике мусора (garbage collector). Как только мы вышли из my_event_handler, локальные переменные тут же уничтожаются сборщиком мусора. Именно поэтому мы видим на форме ту же самую картинку, что и до нажатия на кнопку. Как же быть? Не использовать локальные переменные. Давайте объявим класс, пусть изображение и прочие объекты хранятся в его полях:

import tkinter
from PIL import Image, ImageTk

class App:
def __init__(self):
self.root = tkinter.Tk()

# создаем рабочую область
self.frame = tkinter.Frame(self.root)
self.frame.grid()

# Добавим метку
self.label = tkinter.Label(self.frame, text=»Hello, World!»).grid(row=1, column=1)

self.image = Image.open(«d://1//DSCN1128.png»)
self.photo = ImageTk.PhotoImage(self.image)

# вставляем кнопку
self.but = tkinter.Button(self.frame, text=»Кнопка», command=self.my_event_handler).grid(row=1, column=2)

# Добавим изображение
self.canvas = tkinter.Canvas(self.root, height=600, width=700)
self.c_image = self.canvas.create_image(0, 0, anchor=’nw’, image=self.photo)
self.canvas.grid(row=2, column=1)
self.root.mainloop()

def my_event_handler(self):
print(«my_event_handler»)
self.image = Image.open(«d://1//original.jpg»)
self.photo = ImageTk.PhotoImage(self.image)
self.c_image = self.canvas.create_image(0, 0, anchor=’nw’, image=self.photo)
self.canvas.grid(row=2, column=1)

app= App()


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import tkinter

from PIL import Image, ImageTk

 

class App:

    def __init__(self):

        self.root = tkinter.Tk()

 

        # создаем рабочую область

        self.frame = tkinter.Frame(self.root)

        self.frame.grid()

 

        # Добавим метку

        self.label = tkinter.Label(self.frame, text=»Hello, World!»).grid(row=1, column=1)

 

        self.image = Image.open(«d://1//DSCN1128.png»)

        self.photo = ImageTk.PhotoImage(self.image)

 

        # вставляем кнопку

        self.but = tkinter.Button(self.frame, text=»Кнопка», command=self.my_event_handler).grid(row=1, column=2)

 

        # Добавим изображение

        self.canvas = tkinter.Canvas(self.root, height=600, width=700)

        self.c_image = self.canvas.create_image(0, 0, anchor=’nw’, image=self.photo)

        self.canvas.grid(row=2, column=1)

        self.root.mainloop()

 

    def my_event_handler(self):

        print(«my_event_handler»)

        self.image = Image.open(«d://1//original.jpg»)

        self.photo = ImageTk.PhotoImage(self.image)

        self.c_image = self.canvas.create_image(0, 0, anchor=’nw’, image=self.photo)

        self.canvas.grid(row=2, column=1)

 

app= App()

Теперь все работает.

 

PIL на Python от простого к сложному / Хабр

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

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

Для старта нам потребуется два модуля библиотеки:

from PIL import Image, ImageDraw 

Настроим инструменты для комфортной дальнейшей работы:

image = Image.open('test.jpg')  # Открываем изображение
draw = ImageDraw.Draw(image)  # Создаем инструмент для рисования
width = image.size[0]  # Определяем ширину
height = image.size[1]  # Определяем высоту
pix = image.load()  # Выгружаем значения пикселей

Приступим

Обрабатывать изображения будем в формате RGB. Также PIL поддерживает работу с форматами 1, L, P, RGB, RGBA, CMYK, YCbCr, LAB, HSV, I, F.

Значения пикселя в изображении задаются в формате: (x,y),(red, green, blue), где x,y — координаты, а числовые значения RGB находятся в диапазоне от 0 до 255. То есть работаем с 8-битным изображением.

Оттенок серого

Серый оттенок появляется в случае равенства всех палитр цветов, поэтому нам нужно получить среднее арифметическое значение во всех трёх пунктах:


for x in range(width):
    for y in range(height):
       r = pix[x, y][0] #узнаём значение красного цвета пикселя
       g = pix[x, y][1] #зелёного
       b = pix[x, y][2] #синего
       sr = (r + g + b) // 3 #среднее значение
       draw.point((x, y), (sr, sr, sr)) #рисуем пиксель

image.save("result.jpg", "JPEG") #не забываем сохранить изображение

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

Инверсия

Инверсия получается путём вычета из 255 текущего цвета:


for x in range(width):
   for y in range(height):
      r = pix[x, y][0]
      g = pix[x, y][1]
      b = pix[x, y][2]
      draw.point((x, y), (255 - r, 255 - g, 255 - b))

Инверсия оттенка серого

Совмещая два предыдущих алгоритма можно написать следующий код:


for x in range(width):
    for y in range(height):
        r = pix[x, y][0]
        g = pix[x, y][1]
        b = pix[x, y][2]
        sr = (r + g + b) // 3
        draw.point((x, y), (255 - sr, 255 - sr, 255 - sr))

Выборочная инверсия оттенка серого

Для этого алгоритма нужно определить пороговое значение, которое я возьму за 100:

for x in range(width):
    for y in range(height):
        r = pix[x, y][0]
        g = pix[x, y][1]
        b = pix[x, y][2]
        if (r+g+b)>100: #если сумма значений больше 100 , то используем инверисю
            sr = (r + g + b) // 3
            draw.point((x, y), (255-sr, 255-sr, 255-sr))
        else: #иначе обычный оттенок серого
            sr = (r + g + b) // 3
            draw.point((x, y), (sr, sr, sr))

Заключение

В следующих статьях я хотел бы рассказать о том, как более локально подходить к фильтрации изображения, путём разделения его на области, а также показать интересные возможности DFS в алгоритмах обработки изображения

Как работать с библиотекой Python Pillow (форк PIL) ~ PythonRu

PIL, известная как библиотека Python Imaging Library, может быть использована для работы с изображениями достаточно легким способом. У PIL не было никаких изменений и развития с 2009. Поэтому, добрые пользователи этого сайта предложили взглянуть на Pillow еще раз. Эта статья поможет вам узнать как пользоваться Pillow.

Что такое Pillow?

Pillow это форк PIL (Python Image Library), которая появилась благодаря поддержке Алекса Кларка и других участников. Основана на коде PIL , а затем преобразилась в улучшенную, современную версию. Предоставляет поддержку при открытии,управлении и сохранении многих форматов изображения. Многое работает так же, как и в оригинальной PIL.

Загрузка и установка Pillow

Перед началом использования Pillow, нужно загрузить и установить ее. Pillow доступна для Windows, Mac OS X и Linux. Самая “свежая” версия — это версия “5.3.0” и она поддерживается на python 2.7 и выше. Для инсталляции Pillow на компьютеры Windows используйте easy_install или pip:

easy_install Pillow
pip install Pillow

Для установки Pillow на компьютерах Linux просто используйте:

$ sudo pip install Pillow

А установки Pillow на Mac OS X нужно для начала установить XCode, а затем Homebrew. После того как Homebrew установлен, используйте:

$ brew install libtiff libjpeg webp littlecms
$ sudo pip install Pillow

Убедитесь, что Pillow установлена

Убедитесь, что Pillow установлена, откройте терминал и наберите следующее в текущей строке:

$ python  
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from PIL import  Image

Если система показывает снова >>>, значит модули Pillow правильно установлены.

Форматы файлов

Перед началом использования модуля Pillow, давайте укажем некоторые поддерживаемые типы файлов: BMP, EPS, GIF, IM, JPEG, MSP, PCX PNG, PPM, TIFF, WebP, ICO, PSD, PDF. Некоторые типы файлов возможны только для чтения, в то время как другие доступны только для написания. Чтобы увидеть полный список поддерживаемых типов файла и больше информации о них, ознакомьтесь с руководством к Pillow.

Как использовать Pillow для работы с изображениями

Поскольку мы собираемся работать с изображениями, для начала, скачаем одно. Если у вас уже есть изображение, которое хотите использовать, пропустите этот шаг, описанный ниже. В нашем примере будем использовать стандартное тестовое изображение под названием «Lenna» или «Lena». Это изображение используется во многих экспериментах по обработке изображений. Просто зайдите сюда и загрузите изображение. Если вы нажмете на изображение, оно сохранится как изображение с количеством пикселей 512×512.

Использование Pillow

Подписывайтесь на телеграм каналы

Давайте посмотрим на возможные варианты использования этой библиотеки. Основные функции находятся в модуле Image. Вы можете создавать экземпляры этого класса несколькими способами. Путем загрузки изображений из файлов, обработки других изображений, либо создания изображений с нуля. Импортируйте модули Pillow, которые вы хотите использовать.

from PIL import Image

Затем вы получите доступ к функциям.

myimage = Image.open(filename)  
myimage.load()

Загрузка изображения

Используйте метод open идентификации файла на компьютере, а затем загрузить идентифицированный файл с помощью myfile.load(). Как только изображение будет загружено, с ним можно работать. Часто используется блок try except при работе с файлами. Чтобы загрузить изображение с помощью try except используйте:

from PIL import Image, ImageFilter  

try:  
	original = Image.open("Lenna.png")  
except FileNotFoundError:  
	print("Файл не найден")

Когда мы считываем файлы с диска с помощью функции open(), нам не нужно знать формат файла. Библиотека автоматически определяет формат, основанный на содержании файла. Теперь, когда у вас есть объект Image, вы можете использовать доступные атрибуты для проверки файла. Например, если вы хотите увидеть размер изображения, вы можете использовать атрибут format.

print("The size of the Image is: ")  
print(original.format, original.size, original.mode)

Атрибут size — это tuple(кортеж), содержащий ширину и высоту (в пикселях). Обычные mode: L для изображений с оттенками серого, RGB для изображений с истинным цветным изображением и CMYK для печати изображений. В результате кода выше, вы должны получить следующее (если используете Lenna.png):

The size of t he Image  is:  
PNG, (512, 512), RGB

Размытие изображения

Этот пример загрузит и размоет изображение с жесткого диска.


from PIL import Image, ImageFilter

try:
	
	original = Image.open("Lenna.png")
except FileNotFoundError:
	print("Файл не найден")


blurred = original.filter(ImageFilter.BLUR)

original.show()
blurred.show()

blurred.save("blurred.png")

Размытое изображение должно выглядеть следующим образом:

Чтобы открыть изображение, мы использовали методы show(). Если вы ничего не видите, можете сначала установить ImageMagick и попробовать снова.

Создание миниатюр

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

from PIL import Image

size = (128, 128)
saved = "lenna.jpeg"
img = Image.open("Lenna.png")
img.thumbnail(size)
img.save(saved)
img.show()

Результат выполнения скрипта, можно увидеть в миниатюре:

Фильтры в Pillow

В модуле Pillow предоставляет следующий набор предопределенных фильтров для улучшения изображения:

  • BLUR
  • CONTOUR
  • DETAIL
  • EDGE_ENHANCE
  • EDGE_ENHANCE_MORE
  • EMBOSS
  • FIND_EDGES
  • SMOOTH
  • SMOOTH_MORE
  • SHARPEN

В нашем последнем примере мы покажем, как вы можете применить фильтр CONTOUR к вашему изображению. Приведенный ниже код примет наше изображение и применит к нему фильтр

from PIL import Image, ImageFilter
img = Image.open("Lenna.png")
img = img.filter(ImageFilter.CONTOUR)
img.save("LennaC" + ".jpg")
img.show()

Ниже вы можете увидеть изображение с примененным фильтром CONTOUR:

10 Инструменты для обработки изображений Python

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

Общие задачи обработки изображений включают дисплеи; базовые манипуляции, такие как кадрирование, переворачивание, поворот и т.д .; сегментация изображений, классификация и выделение признаков; восстановление изображения; и распознавание изображений.Python — отличный выбор для этих типов задач обработки изображений из-за его растущей популярности в качестве языка научного программирования и бесплатной доступности многих современных инструментов обработки изображений в его экосистеме.

В этой статье рассматриваются 10 наиболее часто используемых библиотек Python для задач обработки изображений. Эти библиотеки предоставляют простой и интуитивно понятный способ преобразования изображений и понимания лежащих в основе данных.

1. изображение scikit

scikit -image — это пакет Python с открытым исходным кодом, который работает с массивами NumPy.Он реализует алгоритмы и служебные программы для использования в исследованиях, образовании и промышленных приложениях. Это довольно простая и понятная библиотека даже для тех, кто плохо знаком с экосистемой Python. Код высококачественный, прошел экспертную оценку и написан активным сообществом добровольцев.

ресурсов

scikit-image очень хорошо документирован с множеством примеров и практических примеров использования.

Использование

Пакет импортируется как skimage , и большинство функций находится внутри подмодулей.

Фильтрация изображений:

 

import matplotlib.pyplot as plt
% matplotlib inline

из данных импорта skimage, фильтрует

image = data.coins () # ... или любой другой массив NumPy!
края = filters.sobel (изображение)
plt.imshow (края, cmap = 'серый')

Сопоставление шаблонов с использованием функции match_template:

Вы можете найти больше примеров в галерее.

2. NumPy

NumPy — одна из основных библиотек в программировании на Python, обеспечивающая поддержку массивов.Изображение — это, по сути, стандартный массив NumPy, содержащий пиксели точек данных. Поэтому, используя базовые операции NumPy, такие как нарезка, маскирование и необычное индексирование, вы можете изменять значения пикселей изображения. Изображение можно загрузить с помощью skimage и отобразить с помощью Matplotlib.

ресурсов

Полный список ресурсов и документации доступен на официальной странице документации NumPy.

Использование

Использование Numpy для маскировки изображения:

 import numpy as np 
from skimage import data
import matplotlib.pyplot as plt
% matplotlib встроенный

image = data.camera ()
тип (изображение)
numpy.ndarray #Image - это массив NumPy:

mask = image <87
image [mask] = 255
plt.imshow (image, cmap = 'gray')

3. SciPy

SciPy — это еще один из основных научных модулей Python (например, NumPy), который может использоваться для основных задач обработки и обработки изображений. В частности, подмодуль scipy.ndimage (в SciPy v1.1.0) предоставляет функции, работающие с n-мерными массивами NumPy. В настоящий момент пакет включает функции для линейной и нелинейной фильтрации, двоичной морфологии, интерполяции B-сплайном и измерения объектов.

ресурсов

Полный список функций, предоставляемых пакетом scipy.ndimage , см. В документации.

Использование

Использование SciPy для размытия с использованием фильтра Гаусса:

 

из scipy import misc, ndimage

face = misc.face ()
blurred_face = ndimage.gaussian_filter (face, sigma = 3)
very_blurred = ndimage.gaussian_filter (face, sigma = 5)

# Результаты
plt.imshow (<изображение для отображения>)

4. PIL / подушка

PIL (Python Imaging Library) — это бесплатная библиотека для языка программирования Python, которая добавляет поддержку для открытия, управления и сохранения множества различных форматов файлов изображений. Однако его развитие застопорилось, последний выпуск был выпущен в 2009 году.К счастью, существует Pillow , активно разрабатываемая ветвь PIL, которая проще в установке, работает во всех основных операционных системах и поддерживает Python 3. Библиотека содержит базовые функции обработки изображений, включая точечные операции, фильтрацию с помощью набора встроенные ядра свертки и преобразования цветового пространства.

ресурсов

В документации есть инструкции по установке, а также примеры, охватывающие каждый модуль библиотеки.

Использование

Улучшение изображения в Pillow с помощью ImageFilter:

 

из PIL import Image, ImageFilter
#Read image
im = Image.open ('image.jpg')
#Display image
im.show ()

из PIL import ImageEnhance
enh = ImageEnhance.Contrast (im)
enh.enhance (1.8) .show («На 30% больше контраста»)

5. OpenCV-Python

OpenCV (библиотека компьютерного зрения с открытым исходным кодом) — одна из наиболее широко используемых библиотек для приложений компьютерного зрения. OpenCV-Python — это Python API для OpenCV. OpenCV-Python не только быстр, поскольку фон состоит из кода, написанного на C / C ++, но также его легко кодировать и развертывать (благодаря оболочке Python на переднем плане).Это делает его отличным выбором для выполнения ресурсоемких программ компьютерного зрения.

ресурсов

OpenCV2-Python-Guide упрощает начало работы с OpenCV-Python.

Использование

Использование смешивания изображений с использованием пирамид в OpenCV-Python для создания «Orapple»:

6. SimpleCV

SimpleCV — еще одна среда с открытым исходным кодом для создания приложений компьютерного зрения. Он предлагает доступ к нескольким мощным библиотекам компьютерного зрения, таким как OpenCV, но без необходимости знать о битовой глубине, форматах файлов, цветовых пространствах и т. Д.Его кривая обучения существенно меньше, чем у OpenCV, и (как гласит его слоган) «это компьютерное зрение стало проще». Некоторые аргументы в пользу SimpleCV:

  • Даже начинающие программисты могут написать простые тесты машинного зрения
  • Совместимость камер, видеофайлов, изображений и видеопотоков

Ресурсы

Официальная документация очень проста в использовании и содержит множество примеров и вариантов использования.

Использование

7.Махоты

Mahotas — еще одна библиотека компьютерного зрения и обработки изображений для Python. Он содержит традиционные функции обработки изображений, такие как фильтрация и морфологические операции, а также более современные функции компьютерного зрения для вычисления признаков, включая обнаружение точек интереса и локальные дескрипторы. Интерфейс написан на Python, что подходит для быстрой разработки, но алгоритмы реализованы на C ++ и настроены на скорость. Библиотека Махотаса быстрая, с минималистичным кодом и даже с минимальными зависимостями.Прочтите его официальный документ, чтобы узнать больше.

ресурсов

Документация содержит инструкции по установке, примеры и даже несколько руководств, которые помогут вам легко начать работу с Mahotas.

Использование

Библиотека Mahotas для работы использует простой код. Например, он хорошо справляется с задачей Finding Wally с минимальным количеством кода.

Решение проблемы В поисках Уолли:

8. SimpleITK

ITK (Insight Segmentation and Registration Toolkit) — это кроссплатформенная система с открытым исходным кодом, которая предоставляет разработчикам обширный набор программных инструментов для анализа изображений. SimpleITK — это упрощенный уровень, созданный поверх ITK, предназначенный для облегчения его использования в быстром прототипировании, обучении [и] интерпретируемых языках ». Это также набор инструментов для анализа изображений с большим количеством компонентов, поддерживающих общие операции фильтрации, сегментацию изображений , и регистрация. SimpleITK написан на C ++, но доступен для большого количества языков программирования, включая Python.

ресурсов

Существует большое количество Jupyter Notebooks, иллюстрирующих использование SimpleITK в образовательной и исследовательской деятельности.Блокноты демонстрируют использование SimpleITK для интерактивного анализа изображений с использованием языков программирования Python и R.

Использование

Визуализация жесткого процесса регистрации CT / MR, созданного с помощью SimpleITK и Python:

9. pgmagick

pgmagick — это основанная на Python оболочка для библиотеки GraphicsMagick. Систему обработки изображений GraphicsMagick иногда называют Швейцарским армейским ножом обработки изображений. Его надежный и эффективный набор инструментов и библиотек поддерживает чтение, запись и управление изображениями в более чем 88 основных форматах, включая DPX, GIF, JPEG, JPEG-2000, PNG, PDF, PNM и TIFF.

ресурсов

В репозитории GitHub

pgmagick есть инструкции по установке и требования. Также есть подробное руководство пользователя.

Использование

Масштаб изображения:

Извлечение кромок:

10. Пикаир

Pycairo — это набор привязок Python для графической библиотеки Cairo. Cairo — это библиотека 2D-графики для рисования векторной графики. Векторная графика интересна тем, что не теряет четкости при изменении размера или трансформации.Pycairo может вызывать команды Cairo из Python.

ресурсов

Репозиторий Pycairo GitHub — хороший ресурс с подробными инструкциями по установке и использованию. Существует также руководство по началу работы, в котором есть краткое руководство по Pycairo.

Использование

Рисование линий, основных форм и радиальных градиентов с помощью Pycairo:

Заключение

Это некоторые из полезных и свободно доступных библиотек обработки изображений в Python. Некоторые из них хорошо известны, а другие могут быть для вас новыми.Попробуйте их, чтобы узнать о них больше!

.

Управление изображениями с помощью библиотеки изображений Python

В моей предыдущей статье о советах по экономии времени для питонистов я упоминал, что Python — это язык, который может вызывать любовь у пользователей.

Одна из причин этого — количество экономящих время библиотек, доступных для этого языка. Хорошим примером является библиотека изображений Python (PIL), которой и посвящена данная статья.

Что можно делать с помощью PIL

PIL — это бесплатная библиотека, которая добавляет возможности обработки изображений в ваш интерпретатор Python, поддерживая ряд форматов файлов изображений, таких как PPM, PNG, JPEG, GIF, TIFF и BMP.

PIL предлагает несколько стандартных процедур обработки / манипулирования изображениями, например:

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

PIL и подушка

Одна проблема с PIL заключается в том, что его самая последняя версия, 1.1.7, была выпущена в 2009 году и поддерживает только Python 1.5.2–2.7. Хотя сайт PIL обещает следующую версию для Python 3.X, его последняя фиксация была в 2011 году, и, похоже, разработка была прекращена.

К счастью, для пользователей Python 3.X не все потеряно. Проект под названием Pillow разветвил репозиторий PIL и добавил поддержку Python 3.X. Учитывая, что большинство читателей, вероятно, будут работать с Python 3.X, в этой статье я остановлюсь на обновлении Pillow.

Установка подушки

Поскольку Pillow поддерживает версии Python до Python 2.4, я сосредоточусь только на установке Pillow, а не на более старой версии PIL.

Python на Mac

В настоящее время я пишу это руководство для Mac OS X Yosemite 10.10.5 и, таким образом, опишу, как установить Pillow на компьютер Mac OS X. Но не волнуйтесь, в конце этого раздела я дам ссылку, в которой описывается, как установить Pillow в других операционных системах.

Я просто хочу отметить, что Mac OS X поставляется с предустановленным Python. Однако, скорее всего, это будет более ранняя версия, чем 3.X.

Например, на моем компьютере, когда я запускаю $ python --version в терминале, я получаю Python 2.7.10 .

Python и pip

Очень простой способ установить подушку — через пип.

Если на вашем компьютере не установлен pip, просто введите следующую команду в своем терминале, и все готово:

  $ sudo easy_install pip  

Теперь, чтобы установить Pillow, просто введите в свой терминал следующее:

  $ sudo pip install подушка  

Это было легко, не так ли?

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

Некоторые примеры

В этом разделе я продемонстрирую несколько простых вещей, которые мы можем делать с помощью PIL.

Я проведу эти тесты на следующем изображении:

Если вы хотите следовать этим примерам, загрузите изображение.

Прочитать изображение

Это самая основная операция в задаче обработки изображений, поскольку для обработки изображения вы должны сначала прочитать его. С PIL это легко сделать следующим образом:

  из PIL import Image
img = Изображение.открытый ('brick-house.png')  

Обратите внимание, что img — это объект изображения PIL, созданный функцией open () , которая является частью модуля PIL Image .

Так же можно читать уже открытые файлы, или из строки, или из tar-архива.

Преобразование изображения в оттенки серого, отображение и сохранение

Файл brick-house.png представляет собой цветное изображение. Чтобы преобразовать его в оттенки серого, отобразить его, а затем сохранить новое изображение в оттенках серого, вы можете просто сделать следующее:

  из PIL import Image
img = Изображение.open ('кирпич-дом.png'). convert ('L')
img.show ()
img.save ('кирпич-дом-gs', 'png')  

Обратите внимание, что мы использовали три основные функции для выполнения этой операции: convert () , show () и save () . Поскольку мы хотим преобразовать в изображение в оттенках серого, параметр L использовался с convert () .

Вот возвращенное изображение:

Преобразовать в другой тип изображения

Изображение, над которым мы работаем, имеет тип png .Скажем, вы хотите преобразовать его в изображение другого типа, например jpg . Эту операцию можно выполнить с помощью функции save () , которую мы использовали для сохранения нашего результата (записи вывода на диск) в приведенном выше подразделе:

  из PIL import Image
img = Image.open ('brick-house.png')
img.save ('изображение-кирпич', 'jpeg')  

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

Размер (размеры) нашего исходного изображения — 440 x 600 пикселей. Если мы хотим изменить его размер и сделать его размером 256 x 256 пикселей, это можно сделать следующим образом:

  из PIL import Image
img = Изображение.открытый ('brick-house.png')
new_img = img.resize ((256,256))
new_img.save ('кирпичный-дом-256x256', 'png')  

Получится новое квадратное изображение:

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

В заключение

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

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

Я надеюсь, что это введение вдохновило вас попробовать манипулирование изображениями с помощью Python. Радоваться, веселиться!

.

Основные операции с изображениями в Python и OpenCV: изменение размера (масштабирование), поворот и обрезка

Получите мгновенный доступ к коду для этого руководства и всех других 400+ руководств по PyImageSearch.

Внутри вы найдете …

  • Доступ к централизованным репозиториям кода для все 400 руководств в блоге PyImageSearch
  • Предварительно настроенные блокноты Jupyter в Google Colab для всех новых руководств
  • Углубленные видеоуроки для всех новых сообщений в блогах — эти видео включают дополнительные комментарии, методы и советы, которые я не включаю в текстовые версии моих руководств

Введите адрес электронной почты ниже, чтобы получить доступ:

Я использовал часть одного из ваших руководств для решения возникшей у меня проблемы с Python и OpenCV.Боролся с этим две недели, но от других экспертов не ответили. Прочтите вашу статью я нашел …. Исправил за два часа. И это тоже было критически важно. Ваши вещи качественные!

Исмаил Томас-Бенге Старший консультант по обеспечению качества и архитектор

PyImageSearch Plus — получите мгновенный доступ к коду для этого руководства и всех других 400 руководств по PyImageSearch!

Выберите свой тарифный план ниже …

$ 4.95 / мес

49,50 $ / год (экономия 15%)

  • Доступ к централизованным репозиториям кода для все 400 руководств на PyImageSearch
  • Простой код доступа для Все новых руководств , которые публикуются каждый понедельник
  • Простая загрузка в один клик для кода, моделей, наборов данных и т. Д.

$ 14.95 / мес

149,50 $ / год (экономия 15%)

  • Предварительно настроенные блокноты Jupyter в Google Colab для всех новых учебников
  • Запускайте все примеры кода в своем веб-браузере. — работает в Windows, macOS и Linux.
  • Доступ к централизованным репозиториям кода для все 400 руководств на PyImageSearch
  • Простой код доступа для Все новых руководств , которые публикуются каждый понедельник
  • Простая загрузка в один клик для кода, моделей, наборов данных и т. Д.

$ 74.95 / мес

749,50 $ / год (экономия 15%)

  • Видеоуроки для всех новых сообщений в блоге
  • Предварительно настроенные блокноты Jupyter в Google Colab для всех новых учебников
  • Запускайте все примеры кода в своем веб-браузере. — работает в Windows, macOS и Linux.
  • Доступ к централизованным репозиториям кода для все 400 руководств на PyImageSearch
  • Простой код доступа для Все новых руководств , которые публикуются каждый понедельник
  • Простая загрузка в один клик для кода, моделей, наборов данных и т. Д.
  • Доступ к централизованным репозиториям кода для все 400+ руководств в блоге PyImageSearch
  • Простой код доступа для Все новые учебные пособия , которые публикуются каждый понедельник в 10:00 EST
  • Простая загрузка в один клик для исходного кода, наборов данных, предварительно обученных моделей и т. Д.
  • Отменить в любое время
  • Легкий доступ к коду, наборам данных и предварительно обученным моделям для всех 400+ руководств в блоге PyImageSearch
  • Изучите использование Jupyter Notebooks в Google Colab для всех новых руководств , опубликованных на PyImageSearch
  • Используйте предварительно настроенные среды разработки в Google Colab — больше никаких головных болей и траты времени на настройку среды разработки
  • Подробные видеоуроки и пошаговые инструкции для всех новых руководств и руководств
  • Доступ к эксклюзивных сделок по моим книгам и курсам

Я использовал часть одного из ваших руководств для решения возникшей у меня проблемы с Python и OpenCV.Боролся с этим две недели, но от других экспертов не ответили. Прочтите вашу статью я нашел …. Исправил за два часа. И это тоже было критически важно. Ваши вещи качественные!

Исмаил Томас-Бенге Старший консультант по обеспечению качества и архитектор

.

Обработка изображений с использованием Python

Введение

Вы когда-нибудь сталкивались с ситуацией, когда вам нужно отредактировать или изменить несколько изображений?

Очень утомительно работать с каждым изображением по одному. Если вам нужно применить одинаковые изменения ко всем изображениям, это займет очень много времени и утомительно. Но, используя Python, вы можете сделать это довольно быстро.

Давайте поиграем с изображениями.

Чтение изображений и получение деталей изображения

Давайте посмотрим, как мы можем прочитать изображение.Ниже приводится структура моего решения.

В моей папке есть файл Python с именем ImageManipulation.py и файл изображения с именем PythonImageFromGoogle.PNG.

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

  1. pythinImg = Image.open (‘PythonImageFromGoogle.PNG’)
  2. print (pythinImg.size)
  3. print (pythinImg.format)

Здесь я пытаюсь импортировать изображение из PIL.Я буду использовать фильтр изображения в следующих примерах, которые я импортировал вместе с ним.

Размер и формат предоставят вам размер и тип формата изображения соответственно.

Вывод

Как создать новый образ?

Создать новый образ на Python очень просто.

  1. newImage = Image.new (‘RGBA’, (200,150), ‘blue’)
  2. newImage.save (‘newImage.png’)

«Image.new» создаст новое изображение шириной 200 и высотой 150. Цвет изображения синий.

«Сохранить» сохранит изображение в той же папке с указанным здесь именем.

Вывод

Ниже представлена ​​структура папок после выполнения. Вы можете заметить, что в папку добавлен newImage.png.

Поверните изображение и откройте его

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

  1. pythinImg.rotate (180) .save (‘PythonImageFromGoogle180.PNG’)
  2. pythinImg_180 = Image.open (‘PythonImageFromGoogle180.PNG’)
  3. pythinImg_180.show ()

9000 Здесь вращается первая строка. изображение на 180 градусов и сохраняет файл. А в третьей строке открываются повернутые изображения.

Вывод

Ниже представлена ​​структура папок после выполнения. Вы можете заметить файл PythonImageFromGoogle180.PNG добавлен в папку.

Фильтровать изображение

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

  1. image_sharp = pythinImg_180.filter (ImageFilter.SHARPEN)
  2. image_sharp.save (‘PythonImageFromGoogle180Sharpen.PNG’)

Выходные данные

Структура папки

после выполнения

Вы можете заметить, что в папку добавлен PythonImageFromGoogle180Sharpen.PNG.

  1. из PIL import Image, ImageFilter
  2. pythinImg = Image.open (‘PythonImageFromGoogle.PNG’)
  3. print (pythinImg.size)
  4. print (pythinImg.format)
  5. print (pythinImg.format)
  6. newImage = Image.new (‘RGBA’, (200,150), ‘blue’)
  7. newImage.save (‘newImage.png’)
  8. pythinImg.rotate (180) .save (‘PythonImageFromGoogle180.PNG’)
  9. pythinImg_180 = Image.open (‘PythonImageFromGoogle180.PNG’)
  10. pythinImg_180.show ()
  11. image_sharp = pythinImg_1 (Image_sharp = pythinImg_1)
  12. image_sharp.save (‘PythonImageFromGoogle180Sharpen.PNG’)

Вывод

Попробуйте, вам понравится.Удачного кодирования !!!

.

Добавить комментарий

Ваш адрес email не будет опубликован.