Python rgb值和像素
def标准化亮度(img:图像)->图像: “”“Python rgb值和像素,python,python-imaging-library,Python,Python Imaging Library,def标准化亮度(img:图像)->图像: “”“ 计算图片的平均亮度: -这可以通过计算每个像素的平均亮度来实现 在img中(每个像素的平均亮度是这些值的总和) 像素的红色、蓝色和绿色,除以3作为浮点分割) -然后,图片的平均亮度是所有亮度的总和 像素平均值,除以img的宽度和高度的乘积 找到因子,我们称之为x,我们可以乘以 平均亮度为128 将每个像素中的颜色乘以该因子x “”“ 我有点不知所措,我做错了什么,有人能帮我吗 获取因子的计算代码似乎还可以,处理每个像素以获得平均值之和的平均值
获取因子的计算代码似乎还可以,处理每个像素以获得平均值之和的平均值 但是,您调整亮度的修改代码并不是在类似的循环中完成的,因此它将在一个像素上运行,我甚至不确定像素是否在图像中。您还应该在循环中执行此操作:
for i in range(img_width):
for j in range(img_height):
(r, g, b) = pixels[i, j]
pixels[i, j] = (r * x, g * x, b * x)
这将替换您当前拥有的最后三行和最后二行(介于x=…
和return…
之间)。所以你最终会得到的是:
img_width, img_height = img.size
pixels = img.load() # create the pixel map
h = 0
for i in range(img_width):
for j in range(img_height):
r, g, b = pixels[i, j]
avg = sum(pixels[i, j]) / 3
h += avg
total_avg = int(h / (img_width * img_height))
x = 128 // total_avg
# == New stuff below
for i in range(img_width):
for j in range(img_height):
(r, g, b) = pixels[i, j]
pixels[i, j] = (r * x, g * x, b * x)
# == New stuff above
return img
还有一些其他需要注意的事项: 首先,我不确定在这里返回
img
是否正确,除非pixels
是对图像中像素的引用(而不是复制)。你也可以检查一下
此外,对于某些输入数据集,[rgb]*x的值可能超过255。如果是这种情况,您可能希望将它们钳制在0..255范围内,以确保不会发生这种情况。类似(替换上面代码中的“新内容”):
首先,感谢分享他的答案
我只想改进一下答案
平均值的计算可以使用如下列表进行优化:
x=128/(总和([sum(像素[i,j])/3表示范围内的i(img_宽度)表示范围内的j(img_高度)])/(img_宽度*img_高度))
因此,我的完整答案是:
标准化给定图像的亮度
img_width, img_height = img.size
pixels = img.load() # create the pixel map
x = 128 // (sum([sum(pixels[i, j]) / 3 for i in range(img_width) for j in range(img_height)]) / (img_width * img_height))
for i in range(img_width):
for j in range(img_height):
r, g, b = pixels[i, j]
pixels[i, j] = [min(255, r * x), min(255, g * x), min(255, b * x)]
return img
在使用Python进行图像处理时,您确实应该尽可能避免使用for
循环,因为它非常缓慢、冗长、难以阅读,并且更可能包含错误。尝试使用矢量化Numpy函数,或OpenCV或PIL内置函数
#!/usr/bin/env python3
from PIL import Image
import numpy as np
def normalize(im):
"""Normalise brightness of image"""
# Convert to Numpy array
na = np.array(im, dtype=np.float32)
# Calculate average brightness
avg = na.mean()
# Calculate factor x
x = 128 / avg
# Scale whole array as float since likely fractional
na *= x
# Convert back to PIL Image and return
return Image.fromarray(na.astype(np.uint8))
# Load image and normalize
im = Image.open('start.png').convert('RGB')
result = normalize(im)
result.save('result.png')
这段代码在我的机器上运行大约800微秒,而任何带有for
循环的版本都需要大约70倍的时间
输入图像:
结果:
您能添加您遇到的错误或问题吗?请同时使用Shift运算符OpenCV yes,因为出于某种原因,当我将修改放在嵌套for循环中时,会得到零除法error@Jack,您不能将其放入当前循环集中,因为您将除以尚未设置的total\u avg
。你需要另一个循环集。所以基本上,当我做修改时,我只是修改一个像素的平均值,而不是所有像素的平均值?如果是这样,for循环将如何解决这个问题呢?@Jack,for
循环和whree-to-put已经添加到了答案中。在哪里?我仍然只看到它之前的版本
for i in range(img_width):
for j in range(img_height):
# Get original pixel.
(r, g, b) = pixels[i, j]
# Scale with upper limit.
r = min(255, r * x)
g = min(255, g * x)
b = min(255, b * x)
# Replace pixel with scaled one.
pixels[i, j] = (r, g, b)
img_width, img_height = img.size
pixels = img.load() # create the pixel map
x = 128 // (sum([sum(pixels[i, j]) / 3 for i in range(img_width) for j in range(img_height)]) / (img_width * img_height))
for i in range(img_width):
for j in range(img_height):
r, g, b = pixels[i, j]
pixels[i, j] = [min(255, r * x), min(255, g * x), min(255, b * x)]
return img
#!/usr/bin/env python3
from PIL import Image
import numpy as np
def normalize(im):
"""Normalise brightness of image"""
# Convert to Numpy array
na = np.array(im, dtype=np.float32)
# Calculate average brightness
avg = na.mean()
# Calculate factor x
x = 128 / avg
# Scale whole array as float since likely fractional
na *= x
# Convert back to PIL Image and return
return Image.fromarray(na.astype(np.uint8))
# Load image and normalize
im = Image.open('start.png').convert('RGB')
result = normalize(im)
result.save('result.png')