如何用Python操作图像的像素值
众所周知,彩色图像是各种像素的集合。如果我们改变像素值,图像将变成不同颜色的图像。手动完成这项繁琐的任务是非常可怕的,因为一张图像可能包含数百万个像素。因此,我们将写一个Python脚本来轻松完成这项任务。
在开发图像数据的预测模型时,我们有时需要对图像进行操作。为此,Python有一个神奇的库,名为Python Imaging Library(PIL)。这个库包含了一些方法,通过这些方法我们可以提取图像的像素图,并且在循环的帮助下我们可以遍历每个像素,并根据我们的需要改变其像素值。像素是图像中最小的基本组成部分,同样,像素图可以被认为是一个代表图像的像素矩阵。
步骤
1.首先,我们需要一个图像文件作为输入。这个图像文件可以通过Image.new()方法创建,也可以通过Image.open()方法从本地机器导入。这两种情况在下面的例子中都有显示。(不是必须的,但为了方便起见,我们将图像保存为 “input.png”,特别是为了看一看其中的区别。)
2.其次,我们需要在Image.load()方法的帮助下提取输入图像的像素图(像素值的矩阵),这样我们就可以操作我们想要的像素。Image.size方法返回图像(像素图或矩阵)的宽度和高度(列和行)。然后在循环的帮助下,我们将迭代并改变我们所需的像素值。
3.最后,在更新或改变像素值后,我们将得到输出图像。(同样不是强制性的,但为了方便,我们将在Image.save()方法的帮助下把输出图像保存为 “output.png”。 我们还可以使用Image.show()方法在输出屏幕上看到图像。
例子1:使用本地机器的图像,并将其一半变成灰度图像。
将一个图像变为灰度图像的平均公式。
G = (R+G+B) / 3
上述公式在理论上是正确的,但有一个更完善的公式(加权法,也叫光度法,根据红、绿、蓝的波长来衡量)如下。
G = (0.299R + 0.587G + 0.114B)
输入图片:
from PIL import Image
# Import an image from directory:
input_image = Image.open("gfg.png")
# Extracting pixel map:
pixel_map = input_image.load()
# Extracting the width and height
# of the image:
width, height = input_image.size
# taking half of the width:
for i in range(width//2):
for j in range(height):
# getting the RGB pixel value.
r, g, b, p = input_image.getpixel((i, j))
# Apply formula of grayscale:
grayscale = (0.299*r + 0.587*g + 0.114*b)
# setting the pixel value.
pixel_map[i, j] = (int(grayscale), int(grayscale), int(grayscale))
# Saving the final output
# as "grayscale.png":
input_image.save("grayscale", format="png")
# use input_image.show() to see the image on the
# output screen.
输出:
输出图像。
注意:这里一半的图像已经被转换为灰度,但完整的图像可以用同样的代码完成,只需将(width/2)改为(width)即可。要了解更多的信息,请参考Image.getpixel() 方法。
例子2:操纵像素值。
输入图片:
from PIL import Image
# Create an image as input:
input_image = Image.new(mode="RGB", size=(400, 400),
color="blue")
# save the image as "input.png"
#(not mandatory)
input_image.save("input", format="png")
# Extracting pixel map:
pixel_map = input_image.load()
# Extracting the width and height
# of the image:
width, height = input_image.size
z = 100
for i in range(width):
for j in range(height):
# the following if part will create
# a square with color orange
if((i >= z and i <= width-z) and (j >= z and j <= height-z)):
# RGB value of orange.
pixel_map[i, j] = (255, 165, 0)
# the following else part will fill the
# rest part with color light salmon.
else:
# RGB value of light salmon.
pixel_map[i, j] = (255, 160, 122)
# The following loop will create a cross
# of color blue.
for i in range(width):
# RGB value of Blue.
pixel_map[i, i] = (0, 0, 255)
pixel_map[i, width-i-1] = (0, 0, 255)
# Saving the final output
# as "output.png":
input_image.save("output", format="png")
# use input_image.show() to see the image on the
# output screen.
输出: