直方图处理
2021-11-04 本文已影响0人
Tsukinousag
直方图从图像内部灰度级别的角度,直方图的x轴区间一般是[0,255],对应的是8位位图的256个灰度级,y轴对应的具有相应灰度级别的个数
归一化直方图:x轴表示灰度级,y轴表示灰度级出现的频率
注意三个概念:
DIMS:收集参数的数量,一般情况下,直方图中仅有灰度级,该值为1
RANGE: 统计的灰度级的范围
BINS: 参数子集的数目
1.使用Numpy绘制直方图
matplotlib.pyplot.hist(X,BINS)
参数:
X:数据源,必须是一维的。图像通常是二维的,需要通过ravel()函数将图像处理为一维数据源后,再作为参数使用
BINS:灰度级的分组情况
b=a.ravel()
2.使用Opencv绘制直方图
1. 统计直方图信息
该函数可以用来计算图像的统计直方图,可以统计各个灰度级的像素点个数
Hist=cv2.calcHist(image,channels,mask,histSize,ranges,accumulate)
- Hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数
- images:原始图像,[]
- channels:通道编号,[] [0],[1],[2]代表B,G,R
- mask:None
- hitSize:BINS值,[256]
- range:代表像素范围[0,255]
- accumulate:false
再用下面函数绘制
matplotlib.pyplot.plot()
import cv2
import numpy as np
img=cv2.imread("D:/hjbzwy.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
hist=cv2.calcHist([img],[0],None,[256],[0,255])
print(type(hist))
print(hist.shape)
print(hist.size)
print(hist)
<class 'numpy.ndarray'>
(256, 1)
256
[[ 57.]
[ 8.]
[ 15.]
[ 11.]
[ 17.]
[ 22.]
.....
2.plot()函数的使用
import matplotlib.pyplot as plt
x=[0,1,2,3,4,5,6]
y=[0.3,0.4,2,5,3,4.5,4]
plt.plot(x,y)
plt.show()
import matplotlib.pyplot as plt
y=[0.3,0.4,2,5,3,4.5,4]
plt.plot(y)
plt.show()
import matplotlib.pyplot as plt
x=[1,2,3,4,5,6,3]
y=[0.3,0.4,2,5,3,4.5,4]
plt.plot(y,color='r')
plt.plot(x,color='g')
plt.show()
3.绘制统计直方图
import cv2
import matplotlib
import matplotlib.pyplot as plt
img=cv2.imread("D:/zwy.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
histb=cv2.calcHist([img],[0],None,[256],[0,255])
plt.plot(histb,color='b')
plt.show()
import cv2
import matplotlib
import matplotlib.pyplot as plt
img=cv2.imread("D:/zwy.jpg")
histb=cv2.calcHist([img],[0],None,[256],[0,255])
histg=cv2.calcHist([img],[1],None,[256],[0,255])
histr=cv2.calcHist([img],[2],None,[256],[0,255])
plt.plot(histb,color='b')
plt.plot(histr,color='r')
plt.plot(histg,color='g')
plt.show()
3. 使用掩模绘制直方图
import cv2
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
img=cv2.imread("D:/zwy.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
mask=np.zeros([466, 350],dtype=np.uint8)
mask[100:200,100:200]=255
histimage=cv2.calcHist([gray],[0],None,[256],[0,255])
histMI=cv2.calcHist([gray],[0],mask,[256],[0,255])
plt.plot(histimage)
plt.plot(histMI)
plt.show()
4. 直方图均衡化
将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像
-
计算其统计直方图
-
归一化统计直方图
-
计算累计统计直方图
- 在原有范围实现均匀化(当前灰度最大值)
- 在更广范围内实现均衡化(最大映射灰度值)
dst = cv2.equalizeHist( src )
#需要经过ravel()处理
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("D:/hjb.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
equ=cv2.equalizeHist(gray)
cv2.imshow("img",img)
cv2.imshow("equ",equ)
plt.figure("原始图像直方图")
plt.hist(img.ravel(),256)
plt.figure("均衡化直方图")
plt.hist(equ.ravel(),256)
plt.show()
cv2.waitKey(0)
cv2.destroyWindow()
5 pyplot函数
向当前窗口内添加一个子窗口,注意序号是从1开始的
subplot(2,3,4)表示当前两行三列的窗口的第四个位置上,添加一个子窗口
subplot(234)
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("D:/zwy2.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
equ=cv2.equalizeHist(gray)
plt.figure("subplot示例")
plt.subplot(121)
plt.hist(img.ravel(),256)
plt.subplot(122)
plt.hist(equ.ravel(),256)
plt.show()
6. imshow函数
.imshow(x,cmap=None)
参数:
x:图像信息
cmap:色彩空间,默认值是null,使用RGB(A)色彩空间
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("D:/hjb.jpg")
imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.figure("显示结果")
plt.subplot(121)
plt.imshow(img),plt.axis('off')
plt.subplot(122)
plt.imshow(imgRGB),plt.axis('off')
plt.show()
显示灰度图像
注意cv2.imread()读取的图像,其通道顺序是BGR模式的,而.imshow()显示顺序是RGB模式的,且默认色彩空间参数是RGB(A)
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("D:/hjb.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.figure("灰度图像显示演示")
plt.subplot(221)
plt.imshow(img),plt.axis('off')
plt.subplot(222)
plt.imshow(img,cmap=plt.cm.gray),plt.axis('off')
plt.subplot(223)
plt.imshow(gray),plt.axis('off')
plt.subplot(224)
plt.imshow(gray,cmap=plt.cm.gray),plt.axis('off')
plt.show()
以不同的参数形式显示灰度图像
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("D:/100.jpg")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
plt.figure("灰度图像显示演示")
plt.subplot(221);plt.imshow(gray,cmap=plt.cm.gray)
plt.subplot(222);plt.imshow(gray,cmap=plt.cm.gray_r)
plt.subplot(223);plt.imshow(gray,cmap='gray')
plt.subplot(224);plt.imshow(gray,cmap='gray_r')
plt.show()