灰度直方图均衡化的步骤为:
- 读取原图片信息
- 读取灰度图片
- 灰度值计数与归一化
- 计算累积概率
- 创建映射表
- 完成映射
- 显示灰度直方图均衡化效果
# 本质:统计每个像素灰度出现的概率 0~255 p
# 累积概率
# 等级1 出现概率 0.2 -> 0.2
# 2 p 0.3 -> 0.5
# 3 p 0.1 -> 0.6
# 256
# 100这灰度等级 累积概率0.5 -> 255 * 0.5 = new像素替代
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1 读取原图片信息
img = cv2.imread('2.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 2 读取灰度图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('initial gray', gray)
# 3 灰度值计数与归一化
count = np.zeros(256, np.float)
for i in range(0, height):
for j in range(0, width):
index = int(gray[i, j])
count[index] = count[index] + 1
for i in range(0, 255):
count[i] = count[i] / (height * width)
# 4 计算累积概率
sum1 = float(0)
for i in range(0, 256):
sum1 = sum1 + count[i]
count[i] = sum1
print(count) # 累积到1
# 5 创建映射表
map1 = np.zeros(256, np.uint16)
for i in range(0, 256):
map1[i] = np.uint16(count[i] * 255)
# 6 完成映射
for i in range(0, height):
for j in range(0, width):
gray[i, j] = map1[gray[i, j]]
# 7 显示灰度直方图均衡化效果
cv2.imshow('dst gray', gray)
cv2.waitKey(0)
部分的累积概率如下:
![](https://img.haomeiwen.com/i4479796/0be9da9d0145b125.png)
![](https://img.haomeiwen.com/i4479796/88ae8a72c5857a83.png)
灰度直方图均衡化后的效果如下:
![](https://img.haomeiwen.com/i4479796/7dde826cbb002cec.png)
网友评论