一张图像对应的直方图,横坐标是灰度级(比如8位图像,灰度级是0~255),纵坐标表示该灰度级的像素点个数(归一化直方图的话,对应的是该灰度级像素点的频率)。
matplotlib.pyplot绘制直方图
# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("C:\\imgs\\lena256.bmp", flags = cv2.IMREAD_UNCHANGED)
cv2.imshow("original", img)
# hist绘制直方图,gray.ravel()多维数组转成一维数组,256代表灰度级[0, 255]
plt.hist(img.ravel(), 256)
cv2.waitKey()
cv2.destroyAllWindows()
opencv绘制直方图
matplotlib.pyplot绘图示例
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
# 参数,左闭右开区间,0.1是步长
x = np.arange(-3, 3, 0.1)
y = np.sin(x)
plt.plot(x, y)
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
# 参数,左闭右开区间,0.1是步长
x = [1, 2, 3, 4, 5, 6]
y = [3, 1, 7, 2, 10, 12]
plt.plot(x, y, color='red')
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
y = [3, 1, 7, 2, 10, 12]
# 只有y一个参数也可以,观察横坐标从0开始,rgb,每个选项可以填0/1
plt.plot(y, color=[1,0,0])
calcHist():统计图像直方图对应的那个数组,然后用plt画图。
# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("C:\\imgs\\lenacolor.png", flags = cv2.IMREAD_UNCHANGED)
# 参数:图像数组,通道数组,掩码(取图像部分),灰度级数组,灰度级范围数组
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])
# 绘制使用plot(先用calcHist统计某通道上的一维数组)
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
使用掩码的直方图
下图中掩码可以取图像的某一部分绘制直方图(掩码对应的白色区域)。
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_UNCHANGED)
mask = np.zeros(img.shape, np.uint8)
mask[100:200, 100:200] = 255
# 没使用掩码,整幅图像绘制直方图
hist1 = cv2.calcHist([img], [0], None, [256], [0, 255])
# 使用掩码,取图像的一部分绘制直方图
hist2 = cv2.calcHist([img], [0], mask, [256], [0, 255])
plt.plot(hist1)
plt.plot(hist2)
掩码原理及演示
原始图像和掩码图像进行位与运算,就可以了。
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\lena256.bmp", flags=cv2.IMREAD_GRAYSCALE)
mask = np.zeros(img.shape, np.uint8)
mask[100:200, 100:200] = 255
maskimg = cv2.bitwise_and(img, mask)
cv2.imshow("img", img)
cv2.imshow("mask", mask)
cv2.imshow("maskimg", maskimg)
cv2.waitKey()
cv2.destroyAllWindows()
扫描二维码关注公众号,回复:
10830440 查看本文章
直方图均衡化
第1种处理方式
第2种处理方式
直方图均衡化函数equalizeHist
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\equ.bmp", flags=cv2.IMREAD_GRAYSCALE)
res = cv2.equalizeHist(img)
cv2.imshow("img", img)
cv2.imshow("res", res)
plt.hist(img.ravel(), 256)
plt.figure()
plt.hist(res.ravel(), 256)
cv2.waitKey()
cv2.destroyAllWindows()
subplot函数
多幅直方图显示在一起。
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\equ.bmp", flags=cv2.IMREAD_GRAYSCALE)
res = cv2.equalizeHist(img)
# 1行2列的窗口,绘制第1个
plt.subplot(1, 2, 1)
plt.hist(img.ravel(), 256)
# 1行2列的窗口,绘制第2个
plt.subplot(1, 2, 2)
plt.hist(res.ravel(), 256)
matplotlib.pyplot.imshow(x, cmap=None)
x:要绘制的图像
cmap:colormap,默认是RGB类型。灰度图对应的是plt.cm.gray。opencv读入的是BGR类型,要转成RGB类型。
# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\lenacolor.png", flags=cv2.IMREAD_UNCHANGED)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# BGR图像,cmap默认类型RGB ---(错误)
plt.subplot(1, 5, 1)
plt.imshow(img)
plt.axis('off') # 不显示坐标轴
# BGR图像,cmap指定类型gray ---(错误)
plt.subplot(1, 5, 2)
plt.imshow(img, cmap=plt.cm.gray)
plt.axis('off')
# 灰度图像,cmap默认类型RGB ---(错误)
plt.subplot(1, 5, 3)
plt.imshow(gray)
plt.axis('off')
# 灰度图像,cmap指定类型gray ---(正确)
plt.subplot(1, 5, 4)
plt.imshow(gray, plt.cm.gray)
plt.axis('off')
# BGR图像转成RGB图像显示 ---(正确)
b, g, r = cv2.split(img)
img2 = cv2.merge([r, g, b])
plt.subplot(1, 5, 5)
plt.imshow(img2)
plt.axis('off')
更多示例代码
# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("c:\\imgs\\equ.bmp", flags=cv2.IMREAD_GRAYSCALE)
eimg = cv2.equalizeHist(img)
plt.subplot(2, 2, 1)
plt.imshow(img, cmap=plt.cm.gray)
plt.axis('off') # 不显示坐标轴
plt.subplot(2, 2, 2)
plt.imshow(eimg, cmap=plt.cm.gray)
plt.axis('off')
plt.subplot(2, 2, 3)
plt.hist(img.ravel(), 256)
plt.subplot(2, 2, 4)
plt.hist(eimg.ravel(), 256)