这个不是课程作业我就提前放出来了
原理:直方图均衡化的数学原理
原理:直方图均衡化的数学原理
看懂了原理以后代码还挺简单的
1.标记灰度级
hist=np.zeros((2,255)) #建立一个2x255的矩阵
for i in range(255): #第一列为灰度级标记
hist[0,i]=i
for i in range(h):
for j in range(w):
hist[1,img[i,j]]+=1 #记录每个灰度级出现的次数
2.计算出每个灰度级的累计频率
hs=hist.copy()
for i in range(255):
hs[1,i]/=sq #计算每个灰度级的频率
for i in range(255): #计算每个灰度级的累计频率
if i!=0:
hs[1,i]+=hs[1,i-1]
3.求出新图像的灰度级
for i in range(h):
for j in range(w):
HistImg[i,j]=hs[1,img[i,j]]*255 #求出新图像的灰度级
4.彩色图像和灰度图像最大的区别就是彩色图像保存的时候是三维的,第三维是3个色彩通道:BGR,所以在处理的时候需要将彩色图像分成三张灰度图像,然后对这三张图像逐一均衡化:
for i in range(3):
HistImg[:,:,i]=imHist(Img[:,:,i]) # 此为直方图均衡化
完整代码如下:
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 直方图均衡化
def RGB2GRAY(Img):
for i in range(3):
cv.imwrite('jhh'+str(i)+'.jpg',Img[:,:,i])
def cenGray(img): # 统计每个灰度级的个数
h = img.shape[0]
w = img.shape[1]
hist = np.zeros((2, 256)) # 建立一个2x255的矩阵
for i in range(256): # 第一列为灰度级标记
hist[0, i] = i
for i in range(h):
for j in range(w):
hist[1, img[i, j]] += 1 # 记录每个灰度级出现的次数
return hist
def calcFrequency(image): # 根据灰度值累计频率计算每个灰度级映射成什么灰度值
hist = cenGray(image)
h = image.shape[0]
w = image.shape[1]
sq = h * w
for i in range(256):
hist[1, i]= hist[1,i]/sq # 计算每个灰度级的频率
for i in range(256): # 计算每个灰度级的累计频率
if i != 0:
hist[1, i] += hist[1, i - 1]
return hist
def imHist(image):
HistImg = image.copy()
hist = calcFrequency(image)
h=image.shape[0]
w=image.shape[1]
for i in range(h):
for j in range(w):
HistImg[i, j] =int( hist[1, image[i, j]] * 255) # 求出新图像的灰度级
return HistImg
Img = cv.imread('test2.jpg')
HistImg=Img.copy()
for i in range(3):
HistImg[:,:,i]=imHist(Img[:,:,i]) # 此为直方图均衡化
cv.imshow('HistImg',HistImg)
cv.waitKey(0)
cv.destroyAllWindows()
最终结果: