美文网首页
opencv-python直方图操作

opencv-python直方图操作

作者: myserendipit | 来源:发表于2018-02-27 17:00 被阅读101次

    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直方图操作

          本文链接:https://www.haomeiwen.com/subject/ieymxftx.html