直方图均衡化处理:是图像处理领域中利用图像直方图对对比度进行调整的方法。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
总结就是是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分,对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
img=cv2.imread("gray.jpg",0)
hist=cv2.calcHist([img],[0],None,[256],[0,256])
直接调用opencv中直方图的函数calHist。
#灰度图像均衡处理
eq=cv2.equalizeHist(img)#直方图均衡化
cv2.imshow("Histogram Equalization",np.hstack([img,eq]))
这里使用的均衡化也是直接采用函数调用equalizeHist,只包含一个imges参数。
src=cv2.imread("001.jpg")
#彩色图像直方图
colors=cv2.split(src)
colorsNys=("b","g","r")#分解为3个颜色元素
首先将彩色图像分解成三个颜色通道,然后在一个直方图中显示三种颜色
for(color,colorsNy) in zip(colors,colorsNys):
hist=cv2.calcHist([color],[0],None,[256],[0,256])#对每种色彩绘制直方图
plt.plot(hist,color=colorsNy)
plt.xlim([0,256])
plt.show()
彩色图像的均衡处理,将图像颜色分解后可以按照灰度的累积分布函数处理和按各自颜色的分布函数处理。
完整代码如下:
1.灰度图像直方图与均衡处理
#!/usr/bin/env python
# encoding: utf-8
import cv2
from matplotlib import pyplot as plt
import numpy as np
src=cv2.imread("001.jpg")
img=cv2.imread("gray.jpg",0)
#灰度图像图像直方图
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()#新建图像
plt.title("Histogram")#图像标题
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
plt.plot(hist)
plt.xlim([0,256])
plt.show()
#灰度图像均衡处理
eq=cv2.equalizeHist(img)#直方图均衡化
cv2.imshow("Histogram Equalization",np.hstack([img,eq]))
cv2.waitKey(0)
2.彩色图片均衡处理
此处主要参考https://blog.csdn.net/bigcat133/article/details/41513677,有兴趣的同学可以查看详细内容。
#!/usr/bin/env python
# encoding: utf-8
from PIL import Image
from pylab import *
from scipy.misc import *
# 定义直方图均衡化函数,这里传入的参数是灰度图像的数组和累积分布函数值
def histImageArr(im_arr, cdf):
cdf_min = cdf[0]
im_w = len(im_arr[0])
im_h = len(im_arr)
im_num = im_w * im_h
color_list = []
i = 0
# 通过累积分布函数计算灰度转换值
while i < 256:
if i > len(cdf) - 1:
color_list.append(color_list[i - 1])
break
tmp_v = (cdf[i] - cdf_min) * 255 / (im_num - cdf_min)
color_list.append(tmp_v)
i += 1
# 产生均衡化后的图像数据
arr_im_hist = []
for itemL in im_arr:
tmp_line = []
for item_p in itemL:
tmp_line.append(color_list[item_p])
arr_im_hist.append(tmp_line)
return arr_im_hist
#读取图像
src=Image.open('001.jpg')
arr_rgb=array(src)
arr_rcolor=[]
arr_gcolor=[]
arr_bcolor=[]
i=0
#分离三色通道
for itemL in arr_rgb:
arr_gcolor.append([])
arr_rcolor.append([])
arr_bcolor.append([])
for itemC in itemL:
arr_rcolor[i].append(itemC[0])
arr_gcolor[i].append(itemC[1])
arr_bcolor[i].append(itemC[2])
i=i+1
#通过灰度图像的累积分布函数处理
im_gray=src.convert('L')
arr_gray=array(im_gray)
imhist,bins=histogram(arr_gray.flatten(),range(256))
cdf=imhist.cumsum()
arr_rcolor_hist=histImageArr(arr_rcolor,cdf)
arr_gcolor_hist=histImageArr(arr_gcolor,cdf)
arr_bcolor_hist=histImageArr(arr_bcolor,cdf)
#合并三色通道至图片
i=0
arr_hist=[]
for i in range(len(arr_rcolor_hist)):
j=0
tmp_line=[]
for j in range(len(arr_rcolor_hist[i])):
tmp_point=[arr_rcolor_hist[i][j],arr_gcolor_hist[i][j],arr_bcolor_hist[i][j]]
tmp_line.append(tmp_point)
j+=1
arr_hist.append(tmp_line)
i+=1
figure()
im_image=toimage(array(arr_hist),255)
im_image.save("colorHits.png","PNG")