用于相似图片搜索引擎的Python OpenCV图像直方图

图像直方图那么,图像直方图到底是什么?

用于相似图片搜索引擎的Python OpenCV图像直方图

文章插图
图片
图像的构成是由像素点构成的,每个像素点的值代表着该点的颜色(灰度图或者彩色图) 。所谓直方图就是对图像的中的这些像素点的值进行统计,得到一个统一的整体的灰度概念 。直方图表示图像中颜色的分布 。可以将其可视化为图表(或曲线图),以直观地了解强度(像素值)分布 。直方图的好处就在于可以清晰了解图像的整体灰度分布,这对于计算机视觉处理图片有关重要 。
一般情况下直方图都是灰度图像,直方图x轴是灰度值(一般0~255),y轴就是图像中每一个灰度级对应的像素点的个数 。
用于相似图片搜索引擎的Python OpenCV图像直方图

文章插图
灰度空间图片直方图
如何获取图片直方图图片直方图的获取,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图像直方图

文章插图
代码截图
【用于相似图片搜索引擎的Python OpenCV图像直方图】cv2.calcHist(),该函数传递5个参数:
  1. image输入图像,此参数是一个list 对象
  2. channels::传入图像的通道,如果是灰度图像,只有一个通道,值为0,如果是彩色图像(B G R),那么值为0,1,2,中选择一个,对应着BGR各个通道 。同样为list 对象 。
  3. mask:掩膜图像 。如果统计整幅图,那么为none 。主要是如果要统计部分图的直方图,就得构造相应的掩膜图像来计算 。
  4. histSize:灰度级的个数,比如[256],或者三个通道的[32,32,32]
  5. ranges:像素值的范围,通常[0,256],通常,这是[0, 256]针对每个通道的,但是如果您使用的颜色空间不是RGB(例如HSV),则范围可能会有所不同 。
以上展示了图片在灰度值中的颜色直方图,当然,我们的图片是R G B的三色图片,我们也可以分别展示图片在R G B 空间内的图片直方图 。
用于相似图片搜索引擎的Python OpenCV图像直方图

文章插图
彩色空间图片直方图
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()
用于相似图片搜索引擎的Python OpenCV图像直方图

文章插图
代码截图
chans = cv2.split(image)函数把图片分别分割成 R G B 三色空间
分别把三色空间的 R G B 空间传入cv2.calcHist([chan], [0], None, [256], [0, 256])函数来生成不同空间内的颜色图片直方图,最后把图片显示出来
图片mask参数cv2.calcHist函数可以接受mask 来进行图片直方图的显示,默认计算图片的所有区域,但是有时候我们不需要图片的所有区域,我们可以使用mask来扣自己需要的图片区域,进而可以进行自己想要图片区域的直方图
用于相似图片搜索引擎的Python OpenCV图像直方图

文章插图
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()
用于相似图片搜索引擎的Python OpenCV图像直方图

文章插图
代码截图
首先我们获取图片的尺寸img.shape[:2],有了图片的尺寸
我们可以标注自己需要的图片区域mask[100:500,100:500] = 255


推荐阅读