Играемся с изображениями в 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 

ссылка на оригинал статьи http://habrahabr.ru/post/163663/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *