OpenCV3-Python(5)直方图

直方图的一些术语和细节:

  • dims:需要统计的特征数目。在统计灰度图中,dims=1,因为仅仅统计了灰度值。
  • bins:每个特征空间子区段的数目,可译为“直条”或“组距”,在上例bins=16。
  • range:要统计特征的取值范围。在上例中,range=[0,255]

cv2.calcHist(images,channels,mask,histsize,ranges[,hist [accumulate]])

  • images:原图像。当传入函数时应该用中括号括起来,例如:[img]
  • channels:如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0] , [1] , [2] 它们分别对应着通道B,G,R。
  • mask:掩模图像。要统计整幅图像的直方图就把它设为None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)
  • histSize:BIN的数目。也应该用中括号括起来,例如:【256】。
  • ranges:像素值范围,通常为【0,256】 左闭右开
import matplotlib.pyplot as plt
import cv2 as cv
img = cv.imread("/Users/liruiyan/Downloads/IMG_9502.JPG", 0)
hstr = cv.calcHist(img, [0], None, [256], [0, 256])
print(hstr.shape)
# 返回一个矩阵256*1 包含每个灰度值的个数
# 绘制
plt.figure(figsize=(10, 6), dpi=100)  # figsize指定宽和高,dpi指定分辨率
plt.plot(hstr)  # plot(x, y)y返回一个数组 包含每个点的
plt.grid()  # 绘制刻度网格线
plt.show()   # 显示

掩膜设置

为了得到感兴趣区域
创建合适大小的全黑图像mask = np.zeros(img.shape[:2], np.uint8)
感兴趣区域设置为1(用灰度打开即可),mask[750:2000,750:1400] = 1
与操作并设置掩膜覆盖原图 msk_img = cv.bitwise_and(img, img, mask=mask)

import matplotlib.pyplot as plt
import cv2 as cv
import numpy as np

img = cv.imread("/Users/liruiyan/Downloads/IMG_9502.JPG", 0)
mask = np.zeros(img.shape[:2], np.uint8)
mask[750:2000,750:1400] = 1   # 制作掩膜,y的范围,x的范围
plt.imshow(mask, cmap=plt.cm.gray)  # 以灰度方式显示图片
plt.show()
plt.imshow(img,cmap=plt.cm.gray)
plt.show()
msk_img = cv.bitwise_and(img, img, mask=mask)  # 与操作,然后设置掩膜 得到目标图片
plt.imshow(msk_img,cmap=plt.cm.gray)
plt.show()


# 返回一个矩阵256*1 包含每个灰度值的个数
# 绘制
hstr = cv.calcHist([msk_img], [0], mask, [255], [0,256])
plt.figure(figsize=(10, 6), dpi=100)  # figsize指定宽和高,dpi指定分辨率
plt.plot(hstr)  # plot(x, y)y返回一个数组 包含每个点的
plt.grid()  # 绘制刻度网格线
plt.show()    # 显示 

直方图均衡化

dst = cv.equalizeHist(img)
直方图归一化是让直方图平坦化,与均衡化不同

直方图归一化

cv.normalize(src, dst, alpha, beta, norm_type, dtype, mask)

  • src-输入数组
  • dst-输出数组,支持原地运算
  • alpha-range normalization模式的最小值
  • beta-range normalization模式的最大值
  • normType-归一化的类型,可以有以下的取值:
      1. NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
  • mask:操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。

自适应直方图均衡化

图像分块,然后对每个块儿进行直方图均衡化,如果每块儿的对比度超过预定限制,则将该块儿分配到其他块儿中进行均衡化,随后用双线性插值将块儿与块儿进行拼接
clahe = cv.createCLAHE(clipLimit, tileGridSize)

  • clipLimit:对比度限制,默认是40
  • tileGridSize:分块儿大小 默认是8*8

返回自适应均衡化对象clahe = cv.createCLAHE(clipLimit, tileGridSize)
将对象应用到图片上clahe.apply(img)

img = cv.imread("/Users/liruiyan/Downloads/IMG_9502.JPG", 0)
clahe = cv.createCLAHE(3.0, (8,8))
clahe.apply(img)

你可能感兴趣的:(OpenCV,python,opencv,开发语言)