数字图像处理(学习笔记)---直方图均衡(image histogram equalization)(处理灰度图片和彩色图片)

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()

原图像:
(手机里随便找的一张晚上拍的图片)
在这里插入图片描述
直方图:
在这里插入图片描述

处理后的目标图像:
在这里插入图片描述
直方图:
在这里插入图片描述

处理后的图像中,那些黑暗中的建筑出现了,似乎有手机夜间拍摄内味了,哈哈。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值