Python 如何将图像更改为以NumPy数组表示的灰度

Python 如何将图像更改为以NumPy数组表示的灰度,python,numpy,image-processing,Python,Numpy,Image Processing,前言: import numpy as np import matplotlib.pyplot as plt P = plt.imread('coin.jpg') for item in enumerate(P): if item < 128: item = 0 elif item > 128: item = 255 我有一个硬币的图像。这是我插入python的任何硬币的通用图像,我想让这个硬币成为灰度图像。变量P表示包含硬币图片RG

前言:

import numpy as np
import matplotlib.pyplot as plt
P = plt.imread('coin.jpg')
for item in enumerate(P):
    if item < 128:
        item = 0
    elif item > 128:
        item = 255
我有一个硬币的图像。这是我插入python的任何硬币的通用图像,我想让这个硬币成为灰度图像。变量
P
表示包含硬币图片RGB值的数组,我相信我可以将
128
下的任何RGB值更改为
0
,同时将
128
上的任何RGB值更改为
255
,从而将RGB转换为灰度

错误:

import numpy as np
import matplotlib.pyplot as plt
P = plt.imread('coin.jpg')
for item in enumerate(P):
    if item < 128:
        item = 0
    elif item > 128:
        item = 255
我试图使用for循环将
p
生成的数组中的值转换为
0
128
255
。这样做时,我会遇到如下错误:


TypeError:“Sruthi V是正确的。枚举()返回一个元组

所以不是
如果项目<128
应该是
如果项目[1]<128

或者,如果不使用enumerate(),也可以完全删除它。 看来没有它也行

在此,我引述:

将颜色转换为灰度 将任意颜色图像转换为灰度通常不是唯一的;颜色通道的不同权重有效地表示在相机上使用不同彩色摄影滤光片拍摄黑白胶片的效果

因此,您需要实现一种将原始图像转换为灰度图像的算法,即,将从
enumerate()
获得的RGB空间中的颜色元组转换为灰度空间中的颜色元组

如果你想把灰度图像转换成二值图像,你需要

阈值(图像处理) 阈值分割是最简单的图像分割方法。从灰度图像中,可以使用阈值来创建二值图像

阅读有关灰度缩放的更多信息:


  • 两个问题。首先,您没有转换为灰度。其次,
    numpy
    的整个要点是对
    循环进行矢量化,避免
    ,因为循环速度很慢

    从这张图片开始:

    你想要这样的东西:

    #!/usr/local/bin/python3
    import numpy as np
    from PIL import Image
    
    # Load coins and convert to greyscale
    grey = np.array(Image.open('coins.png').convert('L'))
    
    # Threshold at 128
    thresholded=((grey>128)*255).astype(np.uint8)
    
    # Save
    Image.fromarray(thresholded).save('result.png')
    

    请注意,enumerate返回一个元组:索引和值。所以
    item
    这里是一个元组。您可能需要将其与
    项[1]
    进行比较,除了
    枚举
    问题之外,该代码不会在像素上正确循环。但即使你解决了这个问题,你的算法也无法将RGB图像转换为灰度或黑白。我不知道matplotlib,但使用PIL加载图像并将其转换为灰度或黑白会很容易。Numpy可以轻松加载PIL图像。可能重复的是,你正在谈论将普通图像转换为灰度图像,但你真正要做的是把它们转化成。你到底想要什么?