【问题标题】:How to change an image to grayscale represented as a NumPy array如何将图像更改为表示为 NumPy 数组的灰度
【发布时间】:2019-02-13 08:52:35
【问题描述】:

前言:

我有一个硬币的图像。这是我插入 python 的硬币的任何通用图像,我想让这枚硬币成为灰度图像。变量P表示包含硬币图片RGB值的数组,我相信我可以通过将128下的任何RGB值更改为0,同时将@987654326以上的任何RGB值更改为灰度@到255

错误:

我正在尝试使用 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

【问题讨论】:

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

标签: python numpy image-processing


【解决方案1】:

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

所以从这张图片开始:

你想要这样的东西:

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

【讨论】:

    【解决方案2】:

    特此引用Wikipedia:

    将颜色转换为灰度

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

    所以,你需要实现一个算法,将原始图像转换为灰度图像,即将enumerate()得到的RGB空间中颜色的元组转换为元组 灰度空间中的颜色。

    那么如果你想将灰度图像转换成二值图像,你需要thresholding

    阈值化(图像处理)

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

    阅读更多关于灰度化

    【讨论】:

      【解决方案3】:

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

      所以,而不是 if item &lt; 128 它应该是 if item[1] &lt; 128

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

      【讨论】:

        猜你喜欢
        • 2014-07-30
        • 2013-08-30
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多