我似乎无法弄清楚如何使用我的灰度功能并改变它以给我假色。我知道我需要将每种颜色(R,G,B)分解为范围,然后根据每种颜色的范围分配颜色。有没有人知道这是如何工作的?
def grayscale(pic):
(width,height) = pic.size
for y in range (height):
for x in range(width):
pix = cp.getpixel((x,y))
(r, g, b) = pix
avg = (r + g + b)//3
newPix = (avg, avg, avg)
cp.putpixel((x,y),newPix)
return cp
答案 0 :(得分:2)
由于您从未在评论中回答我的后续问题,因此我做了一些猜测并实施了一些内容,以说明如何仅使用PIL
(或pillow
来完成)模块。
from PIL import Image
from PIL.ImageColor import getcolor, getrgb
from PIL.ImageOps import grayscale
try:
xrange
except NameError: # Python 3.
xrange = range
def falsecolor(src, colors):
if Image.isStringType(src): # File path?
src = Image.open(src)
if src.mode not in ['L', 'RGB', 'RGBA']:
raise TypeError('Unsupported source image mode: {}'.format(src.mode))
src.load()
# Create look-up-tables (luts) to map luminosity ranges to components
# of the colors given in the color palette.
num_colors = len(colors)
palette = [colors[int(i/256.*num_colors)] for i in xrange(256)]
luts = (tuple(c[0] for c in palette) +
tuple(c[1] for c in palette) +
tuple(c[2] for c in palette))
# Create grayscale version of image of necessary.
l = src if Image.getmodebands(src.mode) == 1 else grayscale(src)
# Convert grayscale to an equivalent RGB mode image.
if Image.getmodebands(src.mode) < 4: # Non-alpha image?
merge_args = ('RGB', (l, l, l)) # RGB version of grayscale.
else: # Include copy of src image's alpha layer.
a = Image.new('L', src.size)
a.putdata(src.getdata(3))
luts += tuple(xrange(256)) # Add a 1:1 mapping for alpha values.
merge_args = ('RGBA', (l, l, l, a)) # RGBA version of grayscale.
# Merge all the grayscale bands back together and apply the luts to it.
return Image.merge(*merge_args).point(luts)
if __name__ == '__main__':
R, G, B = (255, 0, 0), ( 0, 255, 0), ( 0, 0, 255)
C, M, Y = ( 0, 255, 255), (255, 0, 255), (255, 255, 0)
filename = 'test_image.png'
# Convert image into falsecolor one with 4 colors and display it.
falsecolor(filename, [B, R, G, Y]).show()
下面是一个复合材料,显示了RGB测试图像,中间内部256级灰度图像,以及将其更改为假色的最终结果,仅由四种颜色组成(每种颜色代表64级强度) :
这是另一个复合材料,只是这次显示将已经灰度的图像转换为4种假色的相同调色板。
这样的事情是你想要做的吗?
答案 1 :(得分:1)
看起来你要做的就是确定每个像素的平均亮度,并使每个像素变灰。我会使用原生图像功能,或者如果你想操纵单个像素,至少使用numpy
而不是嵌套for
循环。例如:
from PIL import Image, ImageDraw
import numpy as np
def makeGrey():
W = 800
H = 600
img = Image.new('RGB', (W, H))
draw = ImageDraw.Draw(img)
draw.rectangle((0, H * 0 / 3, W, H * 1 / 3), fill=(174, 28, 40), outline=None)
draw.rectangle((0, H * 1 / 3, W, H * 2 / 3), fill=(255, 255, 255), outline=None)
draw.rectangle((0, H * 2 / 3, W, H * 3 / 3), fill=(33, 70, 139), outline=None)
img.show()
pixels = np.array(img.getdata())
avg_pixels = np.sum(pixels, axis=1) / 3
grey_img = avg_pixels.reshape([H, W])
img2 = Image.fromarray(grey_img)
img2.show()
if __name__ == '__main__':
makeGrey()