直方图
-
函数
- cv2.calHist(images, channels, mask, histSize, ranges)
- images :原图像,图像格式为 uint8 或 float32 。当传入函数时,应用中括号[],例如: [img]
- channels:同样用中括号括起来。如果传入的是灰度图,它的值就是 [0] ,如果是彩色图像,传入的参数可以是 [0][1][2] ,他们分别对应着 BGR 。
- mask :统计整幅图像的直方图,它的值就是 None ,但是如果你想统计图象的某一部分的直方图,你就使用掩模图像。
- histSize : BIN 的数目。也应用中括号括起来。见右下直方图,一般BIN为256,代表0-255个值。
- ranges :像素值范围,常为 [0256] 。
-
代码示例
-
shape介绍
-
import cv2 as cv import numpy as np img = cv.imread('cat.jpg', 0) # 0代表灰度图 hist = cv.calcHist([img], [0], None, [256], [0, 256]) hist.shape
输出:(256,1)
256表示一共有256个可能的取值
1表示输出是二维的。比如说值为123的有多少个,值为234的有多少个。
-
-
画图
-
import cv2 as cv import numpy as np import matplotlib.pyplot as plt img = cv.imread('cat.jpg', 0) # 0代表灰度图 hist = cv.calcHist([img], [0], None, [256], [0, 256]) plt.hist(img.ravel(), 256) plt.show()
-
-
分别画三个通道的直方图
-
import cv2 as cv import matplotlib.pyplot as plt img = cv.imread('cat.jpg') color = ('b', 'g', 'r') for i,col in enumerate(color): histr = cv.calcHist([img], [i], None, [256], [0, 256]) plt.plot(histr,color = col) plt.xlim([0, 256])
-
-
mask操作
-
首先创建掩膜,在规定区域使之为255。
import cv2 as cv import numpy as np import matplotlib.pyplot as plt img = cv.imread('cat.jpg', 0) # 创建mask mask = np.zeros(img.shape[:2], np.uint8) # img.shape[:2]取图像的高和宽 mask[100:300, 100:400] = 255 cv.imshow('mask', mask) cv.waitKey(0) cv.destroyAllWindows()
运行结果:
再将掩膜与原图进行与运算,使之合并:
import cv2 as cv import numpy as np import matplotlib.pyplot as plt img = cv.imread('cat.jpg', 0) # 创建mask mask = np.zeros(img.shape[:2], np.uint8) # img.shape[:2]取图像的高和宽 mask[100:300, 100:400] = 255 mask_img = cv.bitwise_and(img, img, mask=mask) # 与运算,图像的合并 同一张 名字不变 但是后面的mask 是自己设置的mask cv.imshow('mask_img', mask_img) cv.waitKey(0) cv.destroyAllWindows()
结果如下:
最后绘制掩膜部分的直方图:
import cv2 as cv import numpy as np import matplotlib.pyplot as plt img = cv.imread('cat.jpg', 0) # 创建mask mask = np.zeros(img.shape[:2], np.uint8) # img.shape[:2]取图像的高和宽 mask[100:300, 100:400] = 255 mask_img = cv.bitwise_and(img, img, mask=mask) # 与运算,图像的合并 同一张 名字不变 但是后面的mask 是自己设置的mask hist_mask = cv.calcHist([img], [0], mask, [256], [0, 256]) plt.plot(hist_mask) plt.xlim([0, 256]) plt.show()