import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cvshow(name, ndarray):
img = cv2.imshow(name, ndarray)
cv2.waitKey(0)
cv2.destroyAllWindows()
matplotlib.pyplot.hist(X,BINS)
lena = cv2.imread("lena.jpg")
plt.hist(lena.ravel(), 16)
(array([ 2447., 7368., 5412., 11710., 19672., 24738., 23819., 21311.,
15392., 11566., 11007., 12159., 14515., 13735., 9977., 2679.]),
array([ 0. , 15.9375, 31.875 , 47.8125, 63.75 , 79.6875,
95.625 , 111.5625, 127.5 , 143.4375, 159.375 , 175.3125,
191.25 , 207.1875, 223.125 , 239.0625, 255. ]),
)
OpenCV 提供了函数 cv2.calcHist()用来计算图像的统计直方图,该函数能统计各个灰度级的像素点个数。利用 matplotlib.pyplot 模块中的 plot()函数,可以将函数 cv2.calcHist()的统计结果绘制成直方图。
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
hist_red = cv2.calcHist([lena], [2], mask=None, histSize=[16], ranges=[0, 255])
hist_green = cv2.calcHist([lena], [1], mask=None, histSize=[16], ranges=[0, 255])
hist_blue = cv2.calcHist([lena], [0], mask=None, histSize=[16], ranges=[0, 255])
print(hist_red.sum())
print(hist_green.sum())
print(hist_blue.sum())
68852.0
69169.0
69169.0
(16, 1)
plt.figure(figsize=(8, 6), dpi=80)
plt.plot(np.arange(0, 256, 16), hist_blue, color="b", label="blue")
plt.plot(np.arange(0, 256, 16), hist_green, color="g", label="green")
plt.plot(np.arange(0, 256, 16), hist_red, color="r", label="red")
plt.grid()
plt.legend()
左图是原始图像 O,中间的是掩模图像 M,右图是使用掩模图像 M 对原始图像 O 进行掩模运算的结果图像 R。可以将掩模图像看作一块玻璃板,玻璃板上的白色区域是透明的,黑色区
域是不透明的。掩模运算就是将该玻璃板覆盖在原始图像上,透过玻璃板显示出来的部分就是掩模运算的结果图像。
可以将掩模图像的白色背景部分设置为 255,黑色背景部分设置为 0
lena = cv2.imread("lena.jpg", cv2.IMREAD_GRAYSCALE)
print(lena.shape)
mask = np.zeros((lena.shape[0], lena.shape[1]), np.uint8)
mask[70:180, 70:180]=255
cvshow("mask", mask)
#bitwise_and按位操作时,两个数据的shape要一致,注意:彩色图像是三维的
dst = cv2.bitwise_and(lena, mask)
cvshow("dst", dst)
# 并且可以将这个mask直接传入cv2.calcHist()函数中
(263, 263)
如果一幅图像拥有全部可能的灰度级,并且像素值的灰度均匀分布,那么这幅图像就具有高对比度和多变的灰度色调,灰度级丰富且覆盖范围较大。在外观上,这样的图像具有更丰富
的色彩,不会过暗或过亮。
直方图均衡化的算法主要包括两个步骤:
图像 A 如图 ,它是一幅 3 位的位图,即共有 8(0-7)个灰度级,有 49 个像素
在原有范围内实现直方图均衡化时,用当前灰度级的累计概率乘以当前灰度级的最大值 7,并四舍五入得到新的灰度级,并作为均衡化的结果。
在更广泛的范围内实现直方图均衡化时,用当前灰度级的累计概率乘以更广泛范围灰度级的最大值,得到新的灰度级,并作为均衡化的结果。例如,要将灰度级空间扩展为[0, 255]共256 个灰度级,就必须将原灰度级的累计概率乘以 255,得到新的灰度级。其他步骤均一致
dst = cv2.equalizeHist( src )
mary = cv2.imread("mary.png", cv2.IMREAD_GRAYSCALE)
cvshow("mary", mary)
pro = cv2.equalizeHist(mary)
res = np.hstack((mary, pro))
cvshow("res", res)