直方图处理

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)

再用下面函数绘制

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()
上一篇下一篇

猜你喜欢

热点阅读