1. 图像亮度提升:可以直接对灰度值做加法或乘法,注意值溢出问题。
# 定义颜色改变的值
count=35

# 遍历每一个像素点
for row in range(height):
    for col in range(width):
        # 获取每个像素点的颜色值
        (b,g,r) = img[row,col]
        #  增大当前颜色值
        newb = b + count
        newg = g + count
        newr = r + count

        # 校验每个像素值不能越界
        newb = checkColor(newb)
        newg = checkColor(newg)
        newr = checkColor(newr)

        img[row,col] = (newb,newg,newr)
2. openCV内置了一些滑动条,使用回调方法,方便调试。示例如下:
def changeOffset(offset):
    for row in range(height):
        for col in range(width):
            color = src[row, col];
            # 获取3通道的颜色分量
            B = int(color[0]) + offset
            G = int(color[1]) + offset
            R = int(color[2]) + offset
            B = B if B <= 255 else 255
            G = G if G <= 255 else 255
            R = R if R <= 255 else 255
            # 将新的颜色值填充到原来的图
            src[row, col] = (B, G, R)

    cv.imshow("dst", src)

# 创建滑动条
cv.imshow("dst", src)
cv.createTrackbar("offset","dst",10,255,changeOffset);
changeOffset(10)
3. 直方图的求解及绘制过程:可以通过定义一个容器,然后改变容器位置上的值,最后遍历容器绘制直方图。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 定义一个向量,用于记录每个灰度出现的次数
count = np.zeros(256,np.float)

# 统计每一个灰度出现的次数
for row in range(height):
    for col in range(width):
        # 获取每个像素的灰度值
        gray = int(grayImg[row,col])
        # 统计
        count[gray]=count[gray]+1

# 统计出现的概率
# 定义一个向量,用于记录每个灰度出现的次数
ratios = np.zeros(256,np.float)
for i in range(256):
    # 将次数转成概率
    ratios[i] = count[i]/(height*width)

x = np.linspace(0,255,256)
y = ratios

plt.bar(x,y,0.9,color='gray')
plt.show()

cv.waitKey(0)
4. 直方图的api
# 计算直方图 , 注意这里需要用数组的方式传值  None代表无掩膜
hist = cv.calcHist([grayImg],[0],None,[256],[0.0,255.0])
plt.plot(hist,color="green")
plt.show()

或直接借助matplotlib的函数来绘制

# 1.使用Img.ravel()将多行的矩阵转成单行的矩阵
# 2. 然后调用matplot的hist函数自动计算直方图,bins表示像素区间数量
plt.hist(grayImg.ravel(),color="red",bins=256)
plt.show()
5. 手动实现直方图均衡化
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 显示灰度图片
cv.imshow('grayimg',grayImg)
# 定义一个向量,用于记录每个灰度出现的次数
count = np.zeros(256,np.float)

# 统计每一个灰度出现的次数
for row in range(height):
    for col in range(width):
        # 获取每个像素的灰度值
        gray = int(grayImg[row,col])
        # 统计
        count[gray]=count[gray]+1

# 统计出现的概率
# 定义一个向量,用于记录每个灰度出现的次数
ratios = np.zeros(256,np.float)
for i in range(256):
    # 将次数转成概率
    ratios[i] = count[i]/(height*width)

x = np.linspace(0,255,256)
y = ratios

plt.bar(x,y,0.9,color='gray')
plt.show()

# 定义累计概率初值
sum1 = 0.0
# 定义用于记录累计概率的数组
sumRatios = np.zeros(256,np.float)
# 计算每个灰度的累计概率
for i in range(256):
    sum1 = sum1 + ratios[i]
    sumRatios[i]=sum1

x = np.linspace(0,255,256)
y = sumRatios

# 显示均衡化之后的直方图
plt.bar(x,y,0.9,color='green')
plt.show()

# 遍历原灰图
for row in range(height):
    for col in range(width):
        # 取出原灰度
        gray = grayImg[row,col]
        # 取出当前灰度的累计概率
        ratio = sumRatios[gray]
        # 计算新的灰度,并赋值
        grayImg[row,col]=np.uint8(255*ratio)


cv.imshow('new gray img',grayImg)

# 会自己去统计直方图
plt.hist(grayImg.ravel(),color="red",bins=256)
plt.show()

cv.waitKey(0)
6. 直方图均衡化api
equalize_img = cv.equalizeHist(grayImg)
cv.imshow("equalize img",equalize_img)
7. 彩色图像的直方图均衡化:先试用split()函数分离通道,再分别做直方图均衡化,最后合并成一张彩色图像
#绘制直方图
colors = ["blue","green","red"] #定义不同颜色,以备区分不同通道的结果
img_split = cv.split(img)
for i,channel in enumerate(img_split): #这个enumerate()函数很实用,利用好
    plt.hist(channel.ravel(),bins=256,color=colors[i])
    
#合并,通过merge()函数
b_dst = cv.equalizeHist(b)
g_dst = cv.equalizeHist(g)
r_dst = cv.equalizeHist(r)
ret = cv.merge([b_dst,g_dst,r_dst])
cv.imshow("equalize_img",ret)
cv.waitKey(0)
cv.destroyAllWindows()