Python 调整图像的对比度

Python 调整图像的对比度,python,Python,我尝试在不使用任何python库的情况下进行图像对比。就我个人而言,我觉得最好不用使用各种库来更好地理解代码。在我的例子中,我试图避免使用opencv来对比图像 我遇到的问题是类型错误:“int”对象没有属性“\uu getitem\uuuu”。老实说,我不太清楚这个错误意味着什么 import matplotlib.pylab as plt import matplotlib.image as mpimg import numpy as np img = np.uint8(mpimg.imr

我尝试在不使用任何python库的情况下进行图像对比。就我个人而言,我觉得最好不用使用各种库来更好地理解代码。在我的例子中,我试图避免使用opencv来对比图像

我遇到的问题是
类型错误:“int”对象没有属性“\uu getitem\uuuu”
。老实说,我不太清楚这个错误意味着什么

import matplotlib.pylab as plt
import matplotlib.image as mpimg
import numpy as np

img = np.uint8(mpimg.imread('igloo.png'))

img = np.uint8((0.2126* img[:,:,0]) + \
    np.uint8(0.7152 * img[:,:,1]) +\
         np.uint8(0.0722 * img[:,:,2]))

def img_contrast(img):
   for x in range(img.size[0]):
       for y in range(img.size[1]):
           if (x, y) > 128:
              (r, g, b) = img.getpixel((x, y))
              img.putpixel((x, y), (r+80, g+80, b+80))
           else:
              if(x, y) < 128:
                 (r, g, b) = img.getpixel((x, y))
                 img.putpixel((x, y), (r-80, g-80, b-80))

tam = img_contrast(img)

plt.imshow(tam)
将matplotlib.pylab作为plt导入
将matplotlib.image导入为mpimg
将numpy作为np导入
img=np.uint8(mpimg.imread('igloo.png'))
img=np.uint8((0.2126*img[:,:,0])+\
np.uint8(0.7152*img[:,:,1])+\
np.uint8(0.0722*img[:,:,2]))
def img_对比度(img):
对于范围内的x(img.size[0]):
对于范围内的y(img.size[1]):
如果(x,y)>128:
(r,g,b)=img.getpixel((x,y))
图像像素((x,y),(r+80,g+80,b+80))
其他:
如果(x,y)<128:
(r,g,b)=img.getpixel((x,y))
图像像素((x,y),(r-80,g-80,b-80))
tam=img\U对比度(img)
展览策划(tam)

您的代码有很多问题,但首先遇到的问题是您应该调用
img.shape
,而不是
img.size
,但这实际上是冰山一角

我不确定您的初衷是什么,但下面是一些代码,这些代码可以正常工作,看起来它在做一些与对比度相关的事情(尽管颜色以奇怪的方式变化):

代码:

图片前:

图像后:
如果(x,y)>128:
这可能是比较元组和整数时出现的问题。据我所知,您已经在使用:
pylab、matplotlib、numpy
。“不使用任何python库”是什么意思?除此之外,您可能想查看PIL或Pillow(python图像库)。它有一些有用的函数,在代码中这个错误出现在哪里?错误告诉您发生在哪里?您是否尝试过调查导致错误的代码段?如果您想知道如何快速执行,请转到OpenCV或PIL库代码并检查它,它是开源的,您不应该乘/除255吗?@Lakedaemon您肯定是正确的,谢谢并编辑
import pylab as plt
import matplotlib.image as mpimg
import numpy as np


#Read in the image and make it ints for some reason
#(Normally they are floats between 0 and 1 which is why mult by 256)
img = 255*mpimg.imread('igloo.png')

img[:,:,0] = 0.2126*img[:,:,0] #Red
img[:,:,1] = 0.7152*img[:,:,1] #Green
img[:,:,2] = 0.0722*img[:,:,2] #Blue
                               #Last channel is Alpha (transparency)

def img_contrast(img):
    rows,cols,channels = img.shape
    for x in range(rows):
        for y in range(cols):
            if img[x,y,:3].mean > 128:
                (r, g, b) = img[x,y,:3]
                img[x,y,:3] = (r+80, g+80, b+80)
            else:
                (r, g, b) = img[x,y,:3]
                img[x,y,:3] = (r-80, g-80, b-80)

    return img

#Pass the numpy img through the function, then convert it back to floats between 0 and 1
tam = img_contrast(img)
plt.imshow(tam/255)
plt.show()