我正在尝试对图片应用“滤镜”,以将红色,绿色和蓝色内容更改为原始内容的0.1、0.5和0.9。我正在按照本课程的要求使用python和枕头
现在,我正在尝试通过应用.split方法将颜色部分拆分为不同的图片。 接下来,我想将原始图片的不同部分乘以0.1、0.5和0.9 为此,我使用numpy.array()将其转换为矩阵 这是要走的路吗?如果是这样,我如何将更改后的矩阵转换回图片?
import PIL
from PIL import Image
from PIL import ImageFilter
from PIL import ImageEnhance
import numpy
from IPython.display import display
# read image and convert to RGB
image=Image.open("readonly/msi_recruitment.gif")
image=image.convert('RGB')
image_bands = image.split()
rot = image_bands[0]
grün = image_bands[1]
blau = image_bands[2]
#display(image_bands)
print(x)
z = numpy.array(rot)
z = z * [0.1]
display(z)
谢谢您的帮助!
答案 0 :(得分:0)
我很想以numpy的方式完成大部分任务。首先加载库并打开图像:
arr = np.array(im, dtype=float)
然后直接转换为numpy数组:
(height, width, 3)
请注意,这将为您提供形状为arr[:,:,0]
的数组,其中最后3个元素是RGB通道,即dtype=float
是红色通道。 red * 0.1
的原因是使您的“过滤器”更容易,因为您不能直接对整数数据类型(图像大多为uint8
)进行arr[:,:,0] *= 0.1
arr[:,:,1] *= 0.5
arr[:,:,2] *= 0.9
。
然后您可以进行转换:
Image.fromarray(arr.astype(np.uint8))
并转换回PIL /枕头图像,确保在途中返回正确的数据类型:
arr = np.array(im)
arr[:,:,0] //= 10
arr[:,:,1] //= 2
arr[:,:,2] -= arr[:,:,2] // 10
Image.fromarray(arr)
Jupyter为我很好地内联显示
请注意,如果您想使用更少的内存,则可以使用以下内容:
{{1}}
但是做这样的事情很尴尬,因为您的“过滤器”变得更加复杂