python库skimage 实现图像直方图全局均衡化局部均衡化
Posted 我坚信阳光灿烂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python库skimage 实现图像直方图全局均衡化局部均衡化相关的知识,希望对你有一定的参考价值。
函数
from skimage import exposure
from skimage.morphology import disk
from skimage.filters import rank
# Global equalize
img_rescale = exposure.equalize_hist(img)
# Local Equalization
selem = disk(30)
img_eq = rank.equalize(img, selem=selem)
实验:低对比度图像全局均衡化和局部均衡化
"""
============================
Local Histogram Equalization
============================
This example enhances an image with low contrast, using a method called *local
histogram equalization*, which spreads out the most frequent intensity values
in an image.
The equalized image has a roughly linear cumulative distribution function
for each pixel neighborhood.
The local version of the histogram equalization emphasized every local
graylevel variations.
"""
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from skimage import data
from skimage.util.dtype import dtype_range
from skimage.util import img_as_ubyte
from skimage import exposure
from skimage.morphology import disk
from skimage.filters import rank
matplotlib.rcParams[‘font.size‘] = 9
def plot_img_and_hist(image, axes, bins=256):
"""Plot an image along with its histogram and cumulative histogram.
"""
ax_img, ax_hist = axes
# Make and return a second axes that shares the x-axis.
# The new axes will overlay ax (or the current axes if ax is None), and its ticks will be on the right.
ax_cdf = ax_hist.twinx()
# Display image
ax_img.imshow(image, cmap=plt.cm.gray)
ax_img.set_axis_off()
# Display histogram
ax_hist.hist(image.ravel(), bins=bins)
# Change the ScalarFormatter used by default for linear axes.
ax_hist.ticklabel_format(axis=‘y‘, style=‘scientific‘, scilimits=(0, 0))
ax_hist.set_xlabel(‘Pixel intensity‘)
xmin, xmax = dtype_range[image.dtype.type]
ax_hist.set_xlim(xmin, xmax)
# Display cumulative distribution
img_cdf, bins = exposure.cumulative_distribution(image, bins)
ax_cdf.plot(bins, img_cdf, ‘r‘)
return ax_img, ax_hist, ax_cdf
# Load an example image
img = img_as_ubyte(data.moon())
# Global equalize
img_rescale = exposure.equalize_hist(img)
# Equalization
selem = disk(30)
img_eq = rank.equalize(img, selem=selem)
# Display results
fig = plt.figure(figsize=(8, 5))
axes = np.zeros((2, 3), dtype=np.object)
axes[0, 0] = plt.subplot(2, 3, 1)
axes[0, 1] = plt.subplot(2, 3, 2, sharex=axes[0, 0], sharey=axes[0, 0])
axes[0, 2] = plt.subplot(2, 3, 3, sharex=axes[0, 0], sharey=axes[0, 0])
axes[1, 0] = plt.subplot(2, 3, 4)
axes[1, 1] = plt.subplot(2, 3, 5)
axes[1, 2] = plt.subplot(2, 3, 6)
ax_img, ax_hist, ax_cdf = plot_img_and_hist(img, axes[:, 0])
ax_img.set_title(‘Low contrast image‘)
ax_hist.set_ylabel(‘Number of pixels‘)
ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_rescale, axes[:, 1])
ax_img.set_title(‘Global equalise‘)
ax_img, ax_hist, ax_cdf = plot_img_and_hist(img_eq, axes[:, 2])
ax_img.set_title(‘Local equalize‘)
ax_cdf.set_ylabel(‘Fraction of total intensity‘)
# prevent overlap of y-axis labels
fig.tight_layout()
plt.show()
实验结果
以上是关于python库skimage 实现图像直方图全局均衡化局部均衡化的主要内容,如果未能解决你的问题,请参考以下文章
Python 使用skimage实现求两幅图像之间的PSNR值
Python 使用skimage实现求两幅图像之间的PSNR值
python库skimage 绘制二值图像的凸壳(convex hull)