数字图像处理实验之直方图均衡化算法完成测试图像的增强python实现
一、实验要求
在熟悉直方图均衡化的数学原理以及数字图像下直方图均衡化步骤基础上,能够利用python语言编写图像直方图均衡化算法。注意,不能简单使用exposure模块中的equalize_hist()函数来完成直方图均衡化,需自己编写直方图均衡化算法完成测试图像的增强。按实验内容及步骤完成操作,完成实验报告,所有实验环节均由每位学生独立完成,严禁抄袭他人实验结果。
二、测试图像
三、实验步骤
1.理解并初步建立直方图均衡化算法
直方图均衡化是使图像直方图变得平坦的操作。直方图均衡化能够有效地解决图像整体过暗、过亮的问题,增加图像的清晰度。具体流程如下所示。其中S是总的像素数,Lmax是像素的最大取值(8位灰度图像为255),h(i)为图像像素取值为 i 及 小于 i 的像素的总数。
(二)根据(一)中的算法进行函数自定义
# 直方图均衡化
def hist_equal(img, L_max=255):
H, W = img.shape
S = H * W * 1.
out = img.copy()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
L_prime = L_max / S * sum_h
out[ind] = L_prime
out = out.astype(np.uint8)
return out
(三)对示例图片进行输入
# 写入待处理图片
img1 = cv2.imread("img/testimage1.tif",0).astype(np.float)
img2 = cv2.imread("img/testimage2.tif",0).astype(np.float)
(四)绘制原始图像直方图并保存结果,命名分别为‘histogram_out1.pn’和’histogram_out2.png‘
# 绘制原始图像直方图
plt.hist(img1.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'原始图像直方图')
plt.savefig("histogram_in1.png")#保存结果图
plt.show()
plt.hist(img2.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'原始图像直方图')
plt.savefig("histogram_in2.png")#保存结果图
plt.show()
原始直方图如下:
(五)进行均衡化算法验证
# 均衡分布处理
out1 = hist_equal(img1)
out2 = hist_equal(img2)
(六)绘制均衡后图像直方图并保存结果,命名分别为‘histogram_out1.png‘、‘histogram_out2.png‘
# 绘制均衡化后图像直方图
plt.hist(out1.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'均衡后直方图')
plt.savefig("histogram_out1.png")#保存结果图
plt.show()
plt.hist(out2.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'均衡后直方图')
plt.savefig("histogram_out2.png")#保存结果图
plt.show()
均衡后:
(七)显示处理后结果图像和处理前图像进行对比,并对均衡处理结果保存为result1和result2的png格式图片
cv2.imshow("out1", out1)
cv2.imwrite("result1.png", out1)#保存结果图
cv2.imshow("out2", out2)
cv2.imwrite("result2.png", out2)#保存结果图
cv2.waitKey(0)
cv2.destroyAllWindows()
原始图像1:
均衡后1:
原始图像2:
均衡后2:
这里可能会有部分人运行出现乱码的情况,我自己就是出现了乱码,解决方法是:
#解决绘图标题乱码情况
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
如果有人不会安装opencv库的话,可以查看我之前的文章–Anaconda 安装python第三方库的各类方法
总代码:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 直方图均衡化
def hist_equal(img, L_max=255):
H, W = img.shape
S = H * W * 1.
out = img.copy()
sum_h = 0.
for i in range(1, 255):
ind = np.where(img == i)
sum_h += len(img[ind])
L_prime = L_max / S * sum_h
out[ind] = L_prime
out = out.astype(np.uint8)
return out
# 写入待处理图片
img1 = cv2.imread("img/testimage1.tif",0).astype(np.float)
img2 = cv2.imread("img/testimage2.tif",0).astype(np.float)
#解决绘图标题乱码情况
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
# 绘制原始图像直方图
plt.hist(img1.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'原始图像直方图')
plt.savefig("histogram_in1.png")#保存结果图
plt.show()
plt.hist(img2.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'原始图像直方图')
plt.savefig("histogram_in2.png")#保存结果图
plt.show()
# 均衡分布处理
out1 = hist_equal(img1)
out2 = hist_equal(img2)
# 绘制均衡化后图像直方图
plt.hist(out1.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'均衡后直方图')
plt.savefig("histogram_out1.png")#保存结果图
plt.show()
plt.hist(out2.ravel(), bins=255, rwidth=0.8, range=(0, 255))
plt.title(u'均衡后直方图')
plt.savefig("histogram_out2.png")#保存结果图
plt.show()
#结果显示
cv2.imshow("out1", out1)
cv2.imwrite("result1.png", out1)#保存结果图
cv2.imshow("out2", out2)
cv2.imwrite("result2.png", out2)#保存结果图
cv2.waitKey(0)
cv2.destroyAllWindows()