Python rgb值和像素

Python rgb值和像素,python,python-imaging-library,Python,Python Imaging Library,def标准化亮度(img:图像)->图像: “”“ 计算图片的平均亮度: -这可以通过计算每个像素的平均亮度来实现 在img中(每个像素的平均亮度是这些值的总和) 像素的红色、蓝色和绿色,除以3作为浮点分割) -然后,图片的平均亮度是所有亮度的总和 像素平均值,除以img的宽度和高度的乘积 找到因子,我们称之为x,我们可以乘以 平均亮度为128 将每个像素中的颜色乘以该因子x “”“ 我有点不知所措,我做错了什么,有人能帮我吗 获取因子的计算代码似乎还可以,处理每个像素以获得平均值之和的平均值

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')