直方图均衡化有什么用呢?
答:
先说什么是直方图均衡化,通俗的说,以灰度图为例,原图的某一个像素为x,经过某个函数变为y.形成新的图.新的图的灰度值的分布是均匀的,这个过程就叫直方图均衡化.
图像直方图均衡化作用:用来增强对比度.
这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。
首先需要导入一个包 scikit-image
不知道有没有的同学可以使用 pip list 查询
1.7.2
anaconda-navigator 1.9.12
anaconda-project 0.8.3
argh 0.26.2
asn1crypto 1.3.0
astroid 2.4.2
使用 pip install scikit-image导入
导入成功之后
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage import data
moon=data.moon()
# print(moon.shape)
plt.hist(moon.ravel(),bins=256)
plt.show()
#
moon2=cv2.equalizeHist(moon)#直方图均衡化
plt.hist(moon2.reshape(-1),bins=256)
plt.show()
hist=cv2.calcHist([moon],[0],None,[256],[0,256])
plt.plot(hist)
plt.show()
print(hist)
print(hist.shape)
cv2.imshow('moon',moon)
cv2.imshow('moon2',moon2)
cv2.waitKey(0)
cv2.destroyAllWindows()
导入显示月球图片
moon=data.moon() # print(moon.shape) plt.hist(moon.ravel(),bins=256) plt.show()
月球图片直方图化
moon2=cv2.equalizeHist(moon)#直方图均衡化 plt.hist(moon2.reshape(-1),bins=256) plt.show()
hist=cv2.calcHist([moon],[0],None,[256],[0,256]) 第一个参数,图片,第二个参数[0],第三个参数mask 第四个参数 histsize(分成多少份),第五个参数范围从0到256, 左闭右开,256取不到,返回hist plt.plot(hist) plt.show()
print(hist)
print(hist.shape)