美文网首页
OpenCV配合matplotlib库 | 直方图Histrog

OpenCV配合matplotlib库 | 直方图Histrog

作者: 大师的学徒 | 来源:发表于2020-04-07 00:18 被阅读0次
#--<Powered by Jimmy>--
#---<encoding:utf-8>---

import cv2
import numpy as np
from matplotlib import pyplot as plt


def plotDemo256(image):
    plt.hist(image.ravel(), 256)
    plt.show("histogram")


def plotDemo16(image):
    plt.hist(image.ravel(), 16)
    plt.show("histogram")


pic = cv2.imread("face.jpg")
cv2.namedWindow("Viewer", cv2.WINDOW_AUTOSIZE)
cv2.imshow("Viewer", pic)


plotDemo256(pic)
plotDemo16(pic)
cv2.waitKey()
cv2.destroyAllWindows()

hist = cv2.calcHist([pic], [2], None, [256], [0, 256])
print(type(hist))
print(hist.shape)
print(hist.size)
print(hist)

由此可见,返回值为通道为[2],红色的一个256长度的np数列
其中None的位置为mask,可自定义像素位置,为0 1 二值图

mask = np.zeros(image.shape[:2], up.uint8)
mask[200:400, 200:400] = 255
hist = cv2.calcHist([pic], [2], mask, [256], [0, 256])
print(type(hist))
print(hist.shape)
print(hist.size)
print(hist)

matplotlib.pyplot模块内plot()函数可以将返回值绘制为图像

x = [0,1,2,3,4,5,6]
y = [2,3,45,6,67,33,45]
plt.plot(x, y)
plt.plot(y) #如果传入的是单参数,则默认x轴为0,1,2,3...的自然数
plt.show()

a = [1,4,5,7,2,4,7]
b = [3,6,8,3,7,3,6,3]
plt.plot(a, color='r') #其中color="r" 为用红色线表示a内容
plt.plot(b, color='g')
plt.show()

显示BGR三通道直方图

pic = cv2.imread("face.jpg")
histb = cv2.calcHist([pic], [0], None, [256], [0, 255])
histg = cv2.calcHist([pic], [1], None, [256], [0, 255])
histr = cv2.calcHist([pic], [2], None, [256], [0, 255])

plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.show()

图像均衡 cv2.equalizeHist(), 必须用在gray灰度图层上!!!!

pic = cv2.imread("face.jpg", cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(pic)
cv2.imshow("original", pic)
cv2.imshow("equalized", equ)

plt.figure("original")
plt.hist(pic.ravel(), 256)
plt.figure("equalized")
plt.hist(equ.ravel(), 256)
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

matplotlib.pyplot.subplot(rows, cols, index) 可以在当前窗口内建立子窗口
假设subplot(2,3,4),意为在 两行三列的窗口中的第四个位置上添加子窗口, 如果参数小于10,可简写为subplot(234)

picGray = cv2.imread("face.jpg", cv2.IMREAD_GRAYSCALE)
equGray = cv2.equalizeHist(picGray)
cv2.imshow("original", picGray)
cv2.imshow("equalized", equGray)

plt.figure("Original VS Equalized")
plt.subplot(121), plt.hist(picGray.ravel(), 256)
plt.subplot(122), plt.hist(equGray.ravel(), 256)
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

matplotlib.pyplot.imshow(X, cmap=None) 用来显示图像,其中X为图像信息,cmap为色彩空间,默认为RGBA

pic = cv2.imread("face.jpg")
equ = cv2.equalizeHist(cv2.cvtColor(pic, cv2.COLOR_BGR2GRAY))  #必须将RGB转为灰度图才可以用均衡算法
picRGB = cv2.cvtColor(pic, cv2.COLOR_BGR2RGB)
plt.figure("Original VS Equalized VS ConvertRGB")
plt.subplot(131), plt.imshow(pic)
plt.subplot(132), plt.imshow(equ)
plt.subplot(133), plt.imshow(picRGB)
plt.show()

运行以上程序发现图像显示出错,因为plot默认是RGB,而图像导入时为BGR,所以需要进行转换

o = cv2.imread("M.jpg")
pic = cv2.cvtColor(o, cv2.COLOR_BGR2RGB)
picGray = cv2.cvtColor(pic, cv2.COLOR_BGR2GRAY)
equ = cv2.equalizeHist(cv2.cvtColor(o, cv2.COLOR_BGR2GRAY))  #必须将RGB转为灰度图才可以用均衡算法
picBGR = cv2.cvtColor(pic, cv2.COLOR_RGB2BGR)
plt.figure("Original VS Equalized VS ConvertRGB")
plt.subplot(331), plt.imshow(pic), plt.axis("off")
plt.subplot(332), plt.imshow(equ), plt.axis("off")  #显示RGB三通道图,显示错误
plt.subplot(333), plt.imshow(equ, cmap=plt.cm.gray), plt.axis("off")  #plt.cm.gray可以将灰度图像作为输入色彩空间参数
plt.subplot(334), plt.imshow(picBGR), plt.axis("off")
plt.subplot(335), plt.imshow(picGray, cmap=plt.cm.gray), plt.axis("off")
plt.subplot(336), plt.imshow(picGray, cmap=plt.cm.gray_r), plt.axis("off")  #cmap=plt.cm.gray_r r为英文reverse的缩写
plt.show()

相关文章

网友评论

      本文标题:OpenCV配合matplotlib库 | 直方图Histrog

      本文链接:https://www.haomeiwen.com/subject/xbuwphtx.html