zoukankan      html  css  js  c++  java
  • Opencv对比度增强 python API

    直方图

    %matplotlib inline
    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    def calcGrayHist(image):
        #灰度图像矩阵的高和宽
        rows,cols = image.shape
        #存储灰度直方图
        grayHist = np.zeros([256],np.uint64)
        for r in range(rows):
            for c in range(cols):
                grayHist[image[r][c]]+=1
        return grayHist
    if __name__ == "__main__":
        image = cv2.imread("c:/users/76973/desktop/picture/output_image2.jpg",cv2.IMREAD_GRAYSCALE)
        #计算灰度直方图
        grayHist = calcGrayHist(image)
        cv2.imshow("src",image)
        cv2.waitKey(0)
        #画出灰度直方图
        x_range = range(256)
        plt.plot(x_range,grayHist,'r',linewidth = 2, c = 'black')
        #设置坐标轴范围
        y_maxValue = np.max(grayHist)
        plt.axis([0,255,0,y_maxValue])
        #设置坐标轴标签
        plt.xlabel('gray Level')
        plt.ylabel('number of pixels')
        #显示灰度直方图
        plt.show()
    

    在这里插入图片描述

    %matplotlib inline
    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    if __name__ == "__main__":
        image = cv2.imread("c:/users/76973/desktop/picture/output_image2.jpg",cv2.IMREAD_GRAYSCALE)
        #得到了图像矩阵的高和宽
        rows,cols = image.shape
        #将二维图像矩阵变为一维数组,便于计算灰度直方图
        pixelSequence = image.reshape([rows * cols,])
        #组数
        numberBins = 256
        #计算灰度直方图
        histogram, bins, patch = plt.hist(pixelSequence,numberBins,facecolor = 'black', histtype = 'bar')
        #设置坐标轴的标签
        plt.xlabel(u"gray Level")
        plt.ylabel(u"number of pixels")
        #设置坐标轴的范围
        y_maxValue = np.max(histogram)
        plt.axis([0,255,0,y_maxValue])
        plt.show()
    

    在这里插入图片描述

    线性变换

    import numpy as np
    I = np.array([[0,200],[23,4]],np.uint8)
    O = 2*I
    print(O)
    O = 2.0*I#常数数据影响输出类型
    print(O)
    
    [[  0 144]
     [ 46   8]]
    [[  0. 400.]
     [ 46.   8.]]
    
    %matplotlib inline
    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    def plotHist(image):
         #得到了图像矩阵的高和宽
        rows,cols = image.shape
        #将二维图像矩阵变为一维数组,便于计算灰度直方图
        pixelSequence = image.reshape([rows * cols,])
        #组数
        numberBins = 256
        #计算灰度直方图
        histogram, bins, patch = plt.hist(pixelSequence,numberBins,facecolor = 'black', histtype = 'bar')
        #设置坐标轴的标签
        plt.xlabel(u"gray Level")
        plt.ylabel(u"number of pixels")
        #设置坐标轴的范围
        y_maxValue = np.max(histogram)
        plt.axis([0,255,0,y_maxValue])
        plt.show()
    #主函数
    if __name__ == "__main__":
        I = cv2.imread("c:/users/76973/desktop/picture/output_image1.jpg",cv2.IMREAD_GRAYSCALE)
        #线性变换
        a = 2
        O = float(a)*I
    #     O = I.dot(float(a)) 
        #进行数据截断,大于255的值截断为255
        O[O > 255] = 255
        #数据类型转换
        O = np.round(O)
        O = O.astype(np.uint8)
        plotHist(I)
        plotHist(O)
        #显示原图和线性变换的结果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    

    在这里插入图片描述
    在这里插入图片描述

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    def plotHist(image):
         #得到了图像矩阵的高和宽
        rows,cols = image.shape
        #将二维图像矩阵变为一维数组,便于计算灰度直方图
        pixelSequence = image.reshape([rows * cols,])
        #组数
        numberBins = 256
        #计算灰度直方图
        histogram, bins, patch = plt.hist(pixelSequence,numberBins,facecolor = 'black', histtype = 'bar')
        #设置坐标轴的标签
        plt.xlabel(u"gray Level")
        plt.ylabel(u"number of pixels")
        #设置坐标轴的范围
        y_maxValue = np.max(histogram)
        plt.axis([0,255,0,y_maxValue])
        plt.show()
    #主函数
    if __name__ == "__main__":
        I = cv2.imread("c:/users/76973/desktop/picture/output_image4.jpg",cv2.IMREAD_GRAYSCALE)
        #线性变换
        #得到了图像矩阵的高和宽
        rows,cols = I.shape
        #print(rows, cols)
        a = 2
        O = np.zeros((rows,cols),np.uint8)
        for r in range(rows):
            for c in range(cols):
                if I[r,c] <170 and I[r,c]>100:
    #                 print(I[r,c])
                    if 2.0*I[r,c]>255.0:
                        O[r,c] =  255
                    else:
                        O[r,c] =  2.0 * I[r,c]
                else:
                    if 1.0*I[r,c]>255.0:
                        O[r,c] =  255
                    else:
                        O[r,c] =  1.0*I[r,c]
    
        #进行数据截断,大于255的值截断为255
    #     O[O > 255] = 255
        #数据类型转换
    #     O = np.round(O)
        O = O.astype(np.uint8)
        plotHist(I)
        plotHist(O)
        #显示原图和线性变换的结果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    

    在这里插入图片描述

    直方图正规化

    import cv2 
    import numpy as np
    import sys
    #主函数
    if __name__ == "__main__":
        I = cv2.imread("c:/users/76973/desktop/picture/output_image2.jpg",cv2.IMREAD_GRAYSCALE)
        # 求 I 的最大值、最小值
        Imax = np.max(I)
        Imin = np.min(I)
        # 要输出的最小灰度级和最大灰度级
        Omin,Omax = 0, 255
        #计算a 和 b 的值
        a = float(Omax - Omin)/(Imax-Imin)
        print(a)
        b = Omin - a*Imin
        print(b)
        #矩阵的线性变换
        O = a * I + b
        #数据类型转换
        O = O.astype(np.uint8)
        #显示原图和直方图正规化的效果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    1.0
    0.0
    

    使用normalize 函数

    import cv2
    src = cv2.imread("c:/users/76973/desktop/picture/output_image2.jpg",cv2.IMREAD_GRAYSCALE)
    #直方图正规化
    dst  = src.copy()
    cv2.normalize(src,dst,255,0,cv2.NORM_MINMAX,cv2.CV_8U)
    #显示原图与正规化效果
    cv2.imshow("src",src)
    cv2.imshow("dst",dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    伽马变换

    import cv2
    import numpy as np
    # 主函数
    if __name__ == "__main__":
        I = cv2.imread("c:/users/76973/desktop/picture/output_image2.jpg",cv2.IMREAD_GRAYSCALE)
        #图像归一化
        fI = I/255.0
        #伽马变换
        gamma = 0.5
        O = np.power(fI,gamma)
         #显示原图和伽马变换后的效果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    全局直方图均衡化

    import cv2
    import numpy as np
    import math
    def calcGrayHist(image):
        #灰度图像矩阵的高和宽
        rows,cols = image.shape
        #存储灰度直方图
        grayHist = np.zeros([256],np.uint64)
        for r in range(rows):
            for c in range(cols):
                grayHist[image[r][c]]+=1
        return grayHist
    def equalHist(image):
        # 灰度图像矩阵的高、宽
        rows, cols = image.shape
        # 第一步:计算灰度直方图
        grayHist = calcGrayHist(image)
        # 第二步:计算累加灰度直方图
        zeroCumuMoment = np.zeros([256],np.uint32)
        for p in range(256):
            if p == 0:
                zeroCumuMoment[p] = grayHist[0]
            else:
                zeroCumuMoment[p] = zeroCumuMoment[p-1] + grayHist[p]
        # 第三步: 根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系
        outPut_q = np.zeros([256],np.uint8)
        cofficient = 256.0/(rows*cols)
        for p in range(256):
            q = cofficient * float(zeroCumuMoment[p]) - 1
            if q >=0:
                outPut_q[p] = math.floor(q)
            else:
                outPut_q[p] = 0;
        # 第四步:得到直方图均衡化后的图像
        equalHistImage = np.zeros(image.shape,np.uint8)
        for r in range(rows):
            for c in range(cols):
                equalHistImage[r][c] = outPut_q[image[r][c]]
        return equalHistImage
    if __name__ == "__main__":
        I = cv2.imread("c:/users/76973/desktop/picture/output_image2.jpg",cv2.IMREAD_GRAYSCALE)
        I  = equalHist(I)
         #显示原图和伽马变换后的效果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    限制对比度的自适应直方图均值化

    import cv2
    import numpy as np
    if __name__ == "__main__":
        I = cv2.imread("c:/users/76973/desktop/picture/output_image2.jpg",cv2.IMREAD_GRAYSCALE)
        #创建CLAHE对象
        clahe = cv2.createCLAHE(clipLimit = 2.0, tileGridSize = (8, 8))
        #限制对比度的自适应阈值均衡化
        O = clahe.apply(I)
         #显示原图和伽马变换后的效果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
  • 相关阅读:
    WPF treeview 多层次绑定问题 HierarchicalDataTemplate 和 CompositeCollection
    Difference between Visibility.Collapsed and Visibility.Hidden
    WPF style的继承
    Asp.net个性化服务《系列03_购物车》
    SQLServer2005中的uniqueidentifier数据类型与NEWID()函数
    扉页语
    Asp.net个性化服务《系列01_概述》
    Asp.net个性化服务《系列02_快速的匿名用户个性化》
    2010年java课程体系
    easyui修改提示窗
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13860124.html
Copyright © 2011-2022 走看看