在Python中不使用Pillow将图像转为黑白
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img=mpimg.imread('2048.png')
a = np.zeros_like(img)
for j in xrange(img.shape[0]):
for i in xrange(img.shape[1]):
a[j,i] = np.mean(img[j,i])
imgplot = plt.imshow(a)
plt.show()
这是我目前的代码,虽然能正常工作,但速度非常慢,因为它一次只处理一个像素。有没有什么聪明的方法可以利用数组来把图像变成灰色?而且我不能使用像convert("L")这样的函数。
2 个回答
1
这段内容是关于编程问题的讨论,主要是在讲解一些技术细节。虽然具体的问题没有给出,但可以想象这是一个程序员在寻求帮助,想要解决他在编写代码时遇到的困难。
在编程中,常常会遇到各种各样的错误和问题,很多时候这些问题的解决方案可能会涉及到一些特定的代码或方法。程序员们会在像StackOverflow这样的论坛上提问,其他人则会提供他们的见解和解决方案。
对于初学者来说,理解这些讨论可能会有点困难,因为里面可能会涉及一些专业术语和复杂的概念。但其实,编程的核心就是逻辑思维和解决问题的能力。只要多加练习,慢慢就能掌握这些技能。
总之,这段内容反映了编程社区中人们互相帮助、分享知识的精神。无论遇到什么问题,总会有人愿意提供帮助。
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img = mpimg.imread('image.png')
arr = img.mean(axis=-1)
plt.imshow(arr, cmap=plt.get_cmap('gray'))
plt.show()
2
除了unutbus的回答外,在将图像转换为灰度时,你可能还需要注意:均匀加权(取平均值)并不是唯一的方法,也不一定是正确的做法。
根据维基百科的内容:
Y = 0.2126 R + 0.7152 G + 0.0722 B
这段公式的意思是:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
img = mpimg.imread('image.png')
arr = 0.2126* img[...,0] + 0.7152* img[...,1] + 0.0722 * img[...,2]
plt.imshow(arr, cmap=plt.get_cmap('gray'))
plt.show()
注意:关于问题的回答
现在数组已经存储在arr
中,你可以随意操作它。
轮廓
如果你需要一个轮廓或遮罩,可以使用简单的阈值处理。
bw = arr > 0.3
plt.imshow(bw)
plt.show()
不需要添加颜色映射参数,虽然默认是jet
,这会在二值图像中显示为蓝色和红色。
输出
要保存图像,你可以使用plt.savefig
,它会使用应用于图像的颜色映射。这意味着如果你想要一张灰度图像,你需要指定'gray'颜色映射。
另外,使用例如scipy.misc.imsave
可以将二维矩阵保存为灰度图像。你还可以使用其他库,比如png模块。