图像直方图那么,图像直方图到底是什么?
文章插图
图片
图像的构成是由像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图) 。所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念 。直方图表示图像中颜色的分布 。可以将其可视化为图表(或曲线图),以直观地了解强度(像素值)分布 。直方图的好处就在于可以清晰了解图像的整体灰度分布,这对于计算机视觉处理图片有关重要 。
一般情况下直方图都是灰度图像,直方图x轴是灰度值(一般0~255),y轴就是图像中每一个灰度级对应的像素点的个数 。
文章插图
灰度空间图片直方图
如何获取图片直方图图片直方图的获取,opencv已经帮我们集成了函数,当然numpy也同样可以 获取
from matplotlib import pyplot as pltimport numpy as npimport cv2image = cv2.imread("1.jpg")img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)hist = cv2.calcHist([img], [0], None, [256], [0, 256])#numpy方法读取-np.histogram()#hist_np,bins = np.histogram(img.ravel(),256,[0,256])#numpy的另一种方法读取-np.bincount()#hist_np1 = np.bincount(img.ravel(),minlength=256)cv2.imshow("gray", img)plt.figure()plt.title("Grayscale Histogram")plt.xlabel("Bins")plt.ylabel("# of Pixels")plt.plot(hist)plt.show()
文章插图
代码截图
【用于相似图片搜索引擎的Python OpenCV图像直方图】cv2.calcHist(),该函数传递5个参数:
- image输入图像,此参数是一个list 对象
- channels::传入图像的通道,如果是灰度图像,只有一个通道,值为0,如果是彩色图像(B G R),那么值为0,1,2,中选择一个,对应着BGR各个通道 。同样为list 对象 。
- mask:掩膜图像 。如果统计整幅图,那么为none 。主要是如果要统计部分图的直方图,就得构造相应的掩膜图像来计算 。
- histSize:灰度级的个数,比如[256],或者三个通道的[32,32,32]
- ranges:像素值的范围,通常[0,256],通常,这是[0, 256]针对每个通道的,但是如果您使用的颜色空间不是RGB(例如HSV),则范围可能会有所不同 。
文章插图
彩色空间图片直方图
from matplotlib import pyplot as pltimport numpy as npimport cv2image = cv2.imread("1.jpg")cv2.imshow("image", image)chans = cv2.split(image)colors = ("b", "g", "r")plt.figure()plt.title("'Flattened' Color Histogram")plt.xlabel("Bins")plt.ylabel("# of Pixels")features = []for (chan, color) in zip(chans, colors): hist = cv2.calcHist([chan], [0], None, [256], [0, 256]) features.extend(hist) plt.plot(hist, color = color) plt.xlim([0, 256])plt.show()
文章插图
代码截图
chans = cv2.split(image)函数把图片分别分割成 R G B 三色空间
分别把三色空间的 R G B 空间传入cv2.calcHist([chan], [0], None, [256], [0, 256])函数来生成不同空间内的颜色图片直方图,最后把图片显示出来
图片mask参数cv2.calcHist函数可以接受mask 来进行图片直方图的显示,默认计算图片的所有区域,但是有时候我们不需要图片的所有区域,我们可以使用mask来扣自己需要的图片区域,进而可以进行自己想要图片区域的直方图
文章插图
mask 图片直方图
from matplotlib import pyplot as pltimport numpy as npimport cv2image = cv2.imread("1.jpg")img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)mask = np.zeros(img.shape[:2],np.uint8)mask[100:500,100:500] = 255mask_img = cv2.bitwise_and(img,img,mask=mask)hist = cv2.calcHist([img], [0], mask, [256], [0, 256])cv2.imshow("mask", mask_img)plt.figure()plt.title("Grayscale Histogram")plt.xlabel("Bins")plt.ylabel("# of Pixels")plt.plot(hist)plt.show()
文章插图
代码截图
首先我们获取图片的尺寸img.shape[:2],有了图片的尺寸
我们可以标注自己需要的图片区域mask[100:500,100:500] = 255
推荐阅读
- 私域流量的真相
- 外星基地图片 外星人基地在哪
- 适用于软件工程师编码面试的十大算法
- 十二星座|十二星座的职业天赋
- |如何面对领导的压制?
- |旧藏-田黄石蝙蝠纹手串
- C语言的字符char类型
- 月球上外星飞船真实图片 月球是外星人监视地球的飞船
- 冬天雾霾严重 清肺保养最关键
- 翡翠|翡翠必学小知识