opencv-python直方图操作

Histograms

0-255说明你需要256个点来描述一个直方图

术语

  • BINS:上面的直方图显示每个像素值的像素数量,即从0到255。举个例子,如果将直方图分成16份,那么每一份就是一个组,也就是16个像素;我们把这一个组称之为BIN
  • DIMIS:收集数据的参数数量,这个例子中我们只收集关于一个东西的数据,强度值这里是1。

直方图均衡

import cv2
def histogramEqualizeColor(img):
    ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
    channels = cv2.split(ycrcb)
    print len(channels)
    cv2.equalizeHist(channels[0], channels[0])
    cv2.merge(channels, ycrcb)
    cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR, img)
    return img

自适应直方图均衡

# -*-coding:utf-8-*-
import cv2
import numpy as np
# 自适应直方图均衡
def histogram_adapting_equal(image):
    '''
    :param image:输入的图片,需要是opencv的灰度单通道图
    :return: 直方图均衡处理后图
    '''
    clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
    cll = clahe.apply(image)
    return cll

直方图拉伸

# -*-coding:utf-8-*-
import cv2
import numpy as np
def histogram_scale_color(img, minBinNo=0, maxBinNo=250):
    # 使用Numpy函数计算直方图
    # hist, bins = np.histogram(img.flatten(), 256, [0, 256])
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
    lut = np.zeros(256, dtype=img.dtype)  # 创建空的查找表

    # 计算从左边起第一个不为0的直方图位置
    for binNo, binValue in enumerate(hist):
        if binValue != 0:
            # minBinNo = binNo
            break

    # 计算从右边起第一个不为0的直方图位置
    for binNo, binValue in enumerate(hist):
        if binValue != 0:
            # maxBinNo = 255 - binNo
            break

    print 'minBinNo : ', minBinNo, ' , maxBinNo : ', maxBinNo

    for i, v in enumerate(lut):
        if i < minBinNo:
            print '小于minBinNo, 赋值为0'
            lut[i] = 0
        elif i > maxBinNo:
            print '大于maxBinNo, 赋值为255'
            lut[i] = 255
        else:
            lut[i] = int(255.0 * (i - minBinNo) / (maxBinNo - minBinNo) + 0.5)

    result = cv2.LUT(img, lut)

    return result

你可能感兴趣的:(opencv-python直方图操作)