tip:
查看图像直方图:
用opencv中的方法可简单查看图像直方图:
img=cv2.imread('image.jpg')
plt.hist(img.ravel(),255,[0,256]);
plt.title("Matplotlib Method")
plt.show()
1、处理灰度图片
#直方图均衡(灰度图像)
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import math
def HistogramAverage(img):
img_H,img_W=img.shape #灰度图像,只有二维
retimg=np.zeros((img_H,img_W),dtype=np.uint8) #目标图像
sum=np.zeros((256,1)) #统计各灰度值数量0-255
sumary = np.zeros((256, 1)) #统计各灰度值均衡后的值0-255
total=img_H*img_W #总像素数
for i in range(img_H): #统计各灰度值数量
for j in range(img_W):
sum[img[i][j]]+=1
sumary[0]=255*sum[0]/total #计算灰度值0对应的值
for k in range(1,256): #计算灰度值1-255对应的值
sumary[k]+=sumary[k-1]+255*sum[k]/total
for i in range(img_H): #计算到目标图像
for j in range(img_W):
retimg[i][j]=np.round(sumary[img[i][j]])
return retimg
im1=Image.open('histogramAverage.jpg')
im=im1.convert('L') #转化为灰度图像
im_array=np.array(im)
image1 = HistogramAverage(im_array)
image1 = Image.fromarray(image1.astype('uint8')).convert('L') #convert为L--灰度图像
image1.show()
原图像:
直方图:
处理后的目标图像:
直方图:
图像对比度明显变高
2、处理彩色图片
#直方图均衡(RGB图像)
'''
分别对R、G、B三通道进行直方图均衡
'''
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import math
def HistogramAverage(img):
img_H,img_W,_=img.shape #灰度图像,只有二维
retimg=np.zeros((img_H,img_W,3),dtype=np.uint8)
total=img_H*img_W #总像素数、
for l in range(3):#分别对R、G、B三通道进行均衡
sum = np.zeros((256, 1)) # 统计各灰度值数量0-255
sumary = np.zeros((256, 1)) # 统计各灰度值均衡后的值0-255
for i in range(img_H): #统计各灰度值数量
for j in range(img_W):
sum[img[i][j][l]]+=1
sumary[0]=255*sum[0]/total #计算灰度值0对应的值
for k in range(1,256): #计算灰度值1-255对应的值
sumary[k]+=sumary[k-1]+255*sum[k]/total
for i in range(img_H): #计算到目标图像
for j in range(img_W):
retimg[i][j][l]=np.round(sumary[img[i][j][l]])
return retimg
im=Image.open('555.jpg')
im_array=np.array(im)
image1 = HistogramAverage(im_array)
image1 = Image.fromarray(image1.astype('uint8')).convert('RGB') #convert为L--灰度图像
image1.show()
原图像:
(手机里随便找的一张晚上拍的图片)
直方图:
处理后的目标图像:
直方图:
处理后的图像中,那些黑暗中的建筑出现了,似乎有手机夜间拍摄内味了,哈哈。