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

时间:2018-09-08 04:39:57

标签: python numpy image-processing

前言:

我有一个硬币的图像。这是我插入python的硬币的任何普通图像,我想将此硬币制成灰度图像。变量P代表包含硬币图片RGB值的数组,我相信我可以通过将128下的任何RGB值更改为0来将RGB转换为灰度。高于128255的RGB值。

错误:

我正在尝试使用for循环将P生成的数组中的值转换为0128255。当我这样做时,遇到错误为:

  

TypeError:“ tuple”和“ int”的实例之间不支持“ <”。

代码:

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

3 个答案:

答案 0 :(得分:4)

两个问题。首先,您没有转换为灰度。其次,numpy的全部要点是矢量化并避免for循环,因为它们很慢。

所以从这张图片开始:

enter image description here

您想要这样的东西:

#!/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')

enter image description here

答案 1 :(得分:1)

Sruthi V是正确的。 enumerate()返回一个元组。

所以代替 if item < 128 它应该是 if item[1] < 128

或者如果您不使用enumerate(),则可以将其完全删除。 没有它似乎可以正常工作。

答案 2 :(得分:1)

我在这里引用Wikipedia

  

将颜色转换为灰度

     

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

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

然后,如果要将灰度图像转换为二进制图像,则需要thresholding

  

阈值处理(图像处理)

     

阈值化是最简单的图像分割方法。从灰度图像中,可以使用阈值来创建二进制图像。

详细了解灰度