python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python中matplotlib图片的灰度处理

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')
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')

结果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文