文章目录
- 处理流程
- 灰度分布图
处理流程
在Python中,通过【plt】和【numpy】可以实现图像处理的最简单的流程,即读取图片->处理图片->显示结果->保存结果。
import matplotlib.pyplot as plt
import numpy as nppath = 'lena.jpg'
img = plt.imread(path).astype(float)/255
blue = img[:,:,2]fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(img)
plt.title("rgb")ax = fig.add_subplot(122)
ax.imshow(blue, cmap='Blues')
plt.title("blue channel")plt.savefig("test.png")
plt.show()
其中,imread函数用于读取图片,默认数据类型是8位无符号整型,为了便于后续处理,故而将其转换为float类型。
读取到的lena图是RGB图像,共有三个通道,将其第三个通道,即蓝色通道抽取出来,赋予一个新的变量,此即我们的处理流程。
接下来,显示RGB图像和蓝色通道图像的区别,可通过imshow函数进行绘图。根据数据类型的不同,imshow默认的颜色映射方式不同,对于8位无符号整型,默认0和255为黑色和白色;对于浮点数来说,默认0和1为黑色和白色。由于图像已经转换为浮点数,故除以255,以完成从 [ 0 , 255 ] [0,255] [0,255]到 [ 0 , 1 ] [0,1] [0,1]的映射,从而可以正确显示其色彩。
对于单个通道的图像,则需指明映射方式,即cmap参数,由于我们抽选了蓝色通道,故而将其伪彩映射设为Blues。绘图结果如下
最后,savefig可将图像存储为文件,由此便完成了图像处理的基本流程。
灰度分布图
单通道图像作为一种矩阵数据,所有适用于矩阵的统计信息,都可用于图像处理。诸如均值、峰值、极差、标准差等均适用于图像数据,此外,灰度直方图也是一个重要的统计特征,通过plt.hist可直接对单个通道进行绘制,这些均与通常的数据处理相似。
有时,我们比较关心图像的灰度值在横向和纵向的分布,尤其是在寻找信号的时候,如下图所示
这个图像分别按行和按列统计了三个通道的灰度和,根据上面的统计数据可知,在横坐标为80左右的位置,有一个突变,结合图像中的内容可知,这里的确是某个柜子框线。
下面是绘图代码,由于lena图有3个通道,所以在对每行或者每列像素求和时,选择分别对三个通道进行操作。而后在绘制曲线时,对三个通道的值也使用了不同的颜色方案。通过tick_params函数,取消了上图底部和右图左侧的坐标刻度。
xs = [np.sum(img[:,:,i],0) for i in range(3)]
ys = [np.sum(img[:,:,i],1) for i in range(3)]fig = plt.figure()
gs = fig.add_gridspec(2, 2,width_ratios=(4, 1),height_ratios=(1, 4))ax = fig.add_subplot(gs[1, 0])
ax.imshow(img) # 散点图绘制xHist = fig.add_subplot(gs[0, 0], sharex=ax)
xHist.tick_params(axis="x", labelbottom=False)yHist = fig.add_subplot(gs[1, 1], sharey=ax)
yHist.tick_params(axis="y", labelleft=False)colors = 'rgb'
for i in range(3):xHist.plot(xs[i], color=colors[i])yHist.plot(ys[i], np.arange(len(ys[i])),color=colors[i])plt.show()