我正在尝试使用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
如何实现?任何想法将不胜感激。
答案 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()
希望这会有所帮助。
编辑:
在聊天中弄清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()
生成的图像: