Python绘制灰度值与图像像素的关系

时间:2018-08-02 06:08:47

标签: python-3.x matplotlib python-imaging-library

我正在尝试使用python实现ImageJ绘图配置文件。在这里,我将读取一张图像,然后生成一个直方图,其中图像 pixel 在X轴上,图像灰度值在Y轴上。

到目前为止,我已完成以下操作:

from PIL import Image
import numpy as np
import cv2
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

filepath = "default1.jpg"

img = Image.open(filepath).convert('L')
WIDTH, HEIGHT = img.size
pix = img.load()

data = list(img.getdata())  # convert image data to a list of integers
for x in range(0, WIDTH):
    for y in range(0, HEIGHT):
        if(x == 1000 and y == 80):
            print(pix[x, y]) # output is 145. I don't know what is it

我有这张图片used image

ImageJ软件的输出直方图如下所示: enter image description here

如何实现?任何想法将不胜感激。

1 个答案:

答案 0 :(得分:1)

PIL图像实际上具有直方图方法(see the documentation),其输出可以使用matplotlib进行绘制:

from PIL import Image
import matplotlib.pyplot as plt

filepath = "image_histogram.jpg"

img = Image.open(filepath).convert('L')
WIDTH, HEIGHT = img.size
pix = img.load()

data = img.histogram()

fig,ax = plt.subplots()
ax.plot(data)
plt.show()

结果如下所示: result of the above code

希望这会有所帮助。

编辑

在聊天中弄清OP的内容并仔细研究了ImageJ代码之后,这里是一个python代码,可以重现OP提供的绘图。但是请注意,这不是直方图。还要注意,ImageJ实际上可以处理感兴趣的复杂区域(图像的子区域),而我的代码无法做到这一点:

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

filepath = "image_histogram.jpg"

img = Image.open(filepath).convert('L')
WIDTH, HEIGHT = img.size
pix = img.load()

data = np.asarray(img.getdata())
data = data.reshape((HEIGHT,WIDTH))

fig,ax = plt.subplots()
reduced_data = data.mean(axis=0)

ax.plot(reduced_data)

plt.show()

生成的图像:

result of new piece of code