目录
3、numpy中的reval(散开、解开)函数、flatten(变平)函数和reshape()函数
1、imread函数
语法:
import cv2
img = cv2.imread('image.jpg')
print(img)
[[[ 33 26 103]
[ 34 21 100]
[ 34 15 98]
...
[ 74 98 118]
[ 64 89 106]
[ 57 85 101]]
[[ 33 27 102]
[ 33 23 101]
[ 33 18 100]
...
[ 90 124 145]
[ 77 109 128]
[ 67 98 115]]
[[ 33 27 101]
[ 33 24 101]
[ 33 21 101]
...
[103 146 170]
[ 92 130 153]
[ 81 118 137]]
...
[[252 198 154]
[255 212 162]
[255 221 170]
...
[136 111 91]
[112 77 57]
[ 79 38 23]]
[[243 181 139]
[247 193 145]
[251 206 157]
...
[133 111 91]
[116 84 64]
[ 88 50 33]]
[[239 177 139]
[242 183 140]
[249 199 153]
...
[127 109 92]
[113 86 68]
[ 90 57 41]]]
cv2.imread在不加第二个参数的情况下默认将图片转换成了一个三维数组,
最里面的一维代表的是一个像素的三个通道的灰度值,
第二个维度代表的是第一行所有像素的灰度值,
第三个维度,也就是最外面的一个维度代表的是这一张图片。
imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种:
- cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。
- cv2.IMREAD_GRAYSCALE:以灰度模式加载图片,可以直接写0。
- cv2.IMREAD_UNCHANGED:包括alpha,可以直接写-1。
2、calcHist函数
计算图像灰度直方图
图像的灰度直方图可以统计出图像中的每一个像素的灰度值在整个图像中出现的次数
如上图就是一个图像的灰度直方图,横坐标代表的是像素值的范围:[0,255],越接近0表示越黑,越接近255表示图像越亮。纵坐标代表的是每一个灰度值在图像所有像素中出现的次数。柱状图越高,表示该像素值在图像中出现的次数越多。
hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
参数:
- hist表示直方图,返回的是一个二维数组
- images表示原始图像
- channels表示指定通道,通道编号需要用中括号括起,输入图像是灰度图像时,它的值为[0],彩色图像则为[0]、[1]、[2],分别表示B、G、R
- mask表示掩码图像,统计整副图像的直方图设为None;统计图像的某一部分直方图时,需要掩码图像
- histSize表示BINS的数量,参数子集的数目,
- ranges表示像素值范围,例如[0, 255]
- accumulate表示累计叠加标识,默认为false,如果被设置为true,则直方图在开始分配时不会被清零,该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图;多个直方图的累积结果用于对一组图像的直方图计算
import cv2
from matplotlib import pyplot as plt
# 计算直方图
img = cv2.imread('low1.png',0)
hist = cv2.calcHist([img],[0],None,[256],[0,255])
# 画出直方图
plt.figure()
plt.title("Grayscale Histogram")
plt.xlabel("Bins")
plt.ylabel("number of Pixels")
plt.plot(hist)
plt.xlim([0,256])
plt.show()
3、numpy中的reval(散开、解开)函数、flatten(变平)函数和reshape()函数
reval和faltten函数的功能是一样的:将多维数组降为一维。
区别是:
- numpy.flatten()返回一份拷贝,对拷贝的数据所做的修改不会影响(reflects)原始矩阵,
- numpy.ravel()返回的是视图(view,也颇有几分C/C++引用reference的意味),对视图后所做的数据修改会影响(reflects)原始矩阵的数据。
- reshape()函数当参数只有一个且为-1时,表示将数组降为一维。
#两者功能
In [14]: x=np.array([[1,2],[3,4]])
# flattenh函数和ravel函数在降维时默认是行序优先
In [15]: x.flatten()
Out[15]: array([1, 2, 3, 4])
In [17]: x.ravel()
Out[17]: array([1, 2, 3, 4])
# 传入'F'参数表示列序优先
In [18]: x.flatten('F')
Out[18]: array([1, 3, 2, 4])
In [19]: x.ravel('F')
Out[19]: array([1, 3, 2, 4])
#reshape函数当参数只有一个-1时表示将数组降为一维
In [21]: x.reshape(-1)
Out[21]: array([1, 2, 3, 4])
#x.T表示x的转置
In [22]: x.T.reshape(-1)
Out[22]: array([1, 3, 2, 4])
#flatten函数返回的是拷贝,修改返回的a之后原始的数据x并未改变。
>>> x = np.array([[1, 2], [3, 4]])
>>> a = x.flatten()
>>> a[1] = 100
>>>> a
array([ 1, 100, 3, 4])
>>> x
array([[1, 2],
[3, 4]])
#ravel返回的是视图,修改返回的数据a之后,x的内容值也会发生相应改变。
>>> x = np.array([[1, 2], [3, 4]])
>>> a = x.ravel()
>>> a
array([1, 2, 3, 4])
>>> a[1] = 100
>>> a
array([ 1, 100, 3, 4])
>>> x
array([[ 1, 100],
[ 3, 4]])