数字图像处理实验之直方图均衡化算法完成测试图像的增强python实现

数字图像处理实验之直方图均衡化算法完成测试图像的增强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()

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Ashore

感谢各位老板的打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值