1.直方图
- 一个灰度图像一般是由一个二维数组组成,即n行和n列个数组成。其中每一个像素的值都在0到255之间。使用坐标进行显示时,很坐标代表图像的灰度集,纵坐标显示灰度集的个数。使用图像来表示为
读取灰度图像的过程中我们得到的是一个二维数组,但是反映到坐标轴上是一个一维数组,这个是由我们可以使用np.ravel()将一个二维数组转换成一个一维数组。使用的函数:result=cv2.hist(一维数组,bins)
其中bins一般设置成256.
import cv2
import matplotlib.pyplot as plt
import numpy as np
o=cv2.imread('D:\cc1\\boat.bmp',cv2.IMREAD_GRAYSCALE)#以灰度图像进行读取图像
print(o.shape)
print(o.ravel().shape)#将二维数组变成一维数组
plt.hist(o.ravel(),256)
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()
结果为
(576, 720)
(414720,)
2. 归一化直方图在直方图的基础上把纵坐标以占总数的比例进行显示。
2.计算图像中每个像素的个数 calcHist
1.函数:result=cv2.calcHist(images,chanel,mask,histSize,range,accumulate),这里面的变量都要使用list类型
images | 原始图像 | 可以是灰度图像或者彩色图像 |
---|---|---|
chanels | 指定通道 | 灰度图像只有值0彩色图像0,1,2分别代表bgr |
mask | 掩码图像 | 用一段黑白黑白图片进行掩饰 |
histSize | bins的数量 | 一般设置为256 |
ranges | 像素范围RANGE | 一般设置为[0,255] |
accumulate | 累计标识 | 一般使用默认 |
import cv2
import matplotlib.pyplot as plt
o=cv2.imread('D:/cc1/lenacolor.png')
calc_b=cv2.calcHist([o],[0],None,[256],[0,255])#读取b通道
calc_g=cv2.calcHist([o],[1],None,[255],[0,255])#读取g通道
calc_r=cv2.calcHist([o],[2],None,[255],[0,255])#读取r通道
print(calc_b.shape)
plt.plot(calc_b,color='b')#color 可以设置颜色 bgr
plt.plot(calc_g,color='g')
plt.plot(calc_r,color='r')
plt.show()
结果为
- 掩码:在图像中黑色代表不可见白色代表可见,掩码的动作就是首先设置一个和原图像大小一样的黑色区域,然后再改掉图像上一部分值改成255即可:
import cv2
import numpy as np
import matplotlib.pyplot as plt
o=cv2.imread('D:/cc1/lenacolor.png')
o=cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
creat_mask=np.zeros(o.shape,np.uint8)#创建一个和图像大小一样的黑色区域
print(o.shape)
creat_mask[200:400,200:400]=255#设置图像中的白色区域
s1=cv2.calcHist([o],[0],creat_mask,[256],[0,255])
s2=cv2.calcHist([o],[0],None,[256],[0,255])
plt.plot(s1)
plt.title('mask')
plt.figure()
plt.plot(s2)
plt.title('no_mask')
plt.show()
## 3.matplot中的plot绘图介绍:函数:
result=plt.plot(x,y)如果很坐标是从0开始,并且按照等差数列为1的趋势进行递增,则x可以省略:
import matplotlib.pyplot as plt
import numpy as np
s1_x=np.arange(7)#生成0到7
s1_y=np.sin(s1_x)
plt.plot(s1_x,s1_y)#生成sin图像
plt.title('sin')#标题
plt.figure()#进行图像分离
s2_y=[2,3,5,6,7,5,6]
plt.plot(s1_x,s2_y)
plt.title('hvae_s1_x')
plt.figure()
plt.plot(s2_y)
plt.title('no_s1_x')
plt.show()
结果为
.## 4.直方图均衡化处理:
1.有些图像再拍摄的时候,有的地方太亮,有些地方太暗,导致图像边缘化太明显,这个时候我们可以使用这种方式进行处理:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200522153716487.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L09ZTUtfU0s=,size_16,color_FFFFFF,t_70
2.均衡化处理的算法:
先根据图像的像素计算出图像的直方图——然后计算出图像的归一化直方图——归一化累计直方图——均衡画直方图
3.均衡化处理的函数:result=cv2.equalizehist()
import cv2
import matplotlib.pyplot as plt
import numpy as np
o=cv2.imread('D:/cc1/lenacolor.png')
o=cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
c1=cv2.imread('D:/cc1/equ.bmp',cv2.IMREAD_GRAYSCALE)
c3=cv2.imread('D:/cc1/equ2.bmp',cv2.IMREAD_GRAYSCALE)
r1=cv2.equalizeHist(o)
r2=cv2.equalizeHist(c1)
r4=cv2.equalizeHist(c3)
plt.subplot(221)
plt.hist(o.ravel(),256,label='第一个')
plt.title('original')
plt.subplot(222)
plt.hist(r1.ravel(),256,label='第二个')
plt.title('o_equlize')
plt.subplot(223)
plt.hist(r2.ravel(),256,label='第三个')
plt.title('c1_equlize')
plt.subplot(224)
plt.hist(r4.ravel(),256,label='第四个')
plt.title('c2_equlize')
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()
结果为
## 5.subplot—将多个图形放到同一个表格中:
import cv2
import matplotlib.pyplot as plt
import numpy as np
o=cv2.imread('D:/cc1/girl.bmp')
s1_b=cv2.calcHist([o],[0],None,[256],[0,255])
s1_g=cv2.calcHist([o],[1],None,[256],[0,255])
s1_r=cv2.calcHist([o],[2],None,[256],[0,255])
plt.subplot(131),plt.plot(s1_b)#创建一个1行3列的表格并蒋图形放到第一个表格中
plt.subplot(132),plt.plot(s1_g)#放到第二个
plt.subplot(133),plt.plot(s1_r)#放到三个
plt.show()
结果为
注:本次文章根据李老师视频进行编写: