Python中关于matplotlib图片的灰度处理方式
作者:小阔爱_data
这篇文章主要介绍了Python中关于matplotlib图片的灰度处理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Python中matplotlib图片的灰度处理
环境是ubuntu中的jupyter的环境
图像的灰度化处理的基本原理
将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。
为什么要进行灰度化处理
彩色图像中的每个像素的颜色有R、G、B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围。
而灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些。
灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征。
图像的灰度化处理可用三种方法来实现。
常见的三种方法
- 先对数据进行基本的处理
#引入包 import matplotlib.pyplot as plt %matplotlib inline import numpy as np
#读取文件 zhima=plt.imread('芝麻.jpg') plt.imshow(zhima)
#转变需要的类型,并且产生噪声,显示最后的图片 zhima_noisy=zhima.copy().astype(float) zhima_noisy+=zhima_noisy.std()*0.3*np.random.standard_normal(zhima_noisy.shape) plt.imshow(zhima_noisy)
#查看形状 zhima.shape #输出结果为:(662, 1000, 3)
- 平均值法
#聚合操作后就减少了一个维度了 zhima_mean=zhima.mean(axis=2) zhima_mean.shape #输出结果为:(662, 1000) plt.imshow(zhima_mean,cmap='gray')
- 最大值法
#最大值法 zhima_max=zhima.max(axis=-1) zhima_max.shape plt.imshow(zhima_max,cmap='gray')
- RGB三原色法
gravity= np.array([0.299,0.587,0.114]) #red*0.299+green*0.587+blue*0.114 #矩阵乘法 zhima_gravity=np.dot(zhima,gravity) zhima_gravity.shape plt.imshow(zhima_gravity,cmap='gray')
Matplotlib显示灰度图
matplotlib中的imshow()函数不能自动显示灰度图像,这一点应该是众所周知的,需要调用cmap=“gray"以进行设置,但是cmap="gray"实际上并不是如opencv中的imshow函数一样将单通道图显示为灰度图,私以为是引入了灰度图的灰度量化概念,但并不直接对应灰度,证明见正文。
测试
设置一全1.0的图像(全白),和一全白背景叠加黑色条柱的图像,使用plt.imshow()显示。
代码:
import matplotlib.pyplot as plt import numpy as np white=np.ones((100,100),dtype=float) bar=np.ones((100,100),dtype=float) bar[40:50,:]=0 plt.figure(1) plt.subplot(211) plt.imshow(white,cmap='gray') plt.title('white map') plt.subplot(212) plt.imshow(bar,cmap='gray') plt.title('black bar')
结果为:
由此可以发现在值全为1.0时,图像显示为黑色,那么是否是dtype的原因呢?测试常用的uint8情况下,亮度为恒定值,显示几何。
代码为:
white1=np.ones((100,100),dtype=np.uint8)*255 white2=np.ones((100,100),dtype=np.uint8)*128 plt.figure((2)) plt.subplot(211) plt.imshow(white1,cmap='gray') plt.title('white1') plt.subplot(212) plt.imshow(white2,cmap='gray') plt.title('white2')
结果为:
由此可以确定,这一显示“异常”与数据类型无关 。
解决方案
使用vmin,vmax参数指定灰度范围,或者设定cmap为gray_r以使得灰度范围反转,后者只适用于想显示白色背景。
代码:
white1=np.ones((100,100),dtype=np.uint8)*255 white2=np.ones((100,100),dtype=np.uint8)*128 plt.figure((2)) plt.subplot(211) plt.imshow(white1,cmap='gray_r') plt.title('white1') plt.subplot(212) plt.imshow(white2,cmap='gray',vmin=0,vmax=255) plt.title('white2')
结果:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。